跳至内容

设置

安装 Prisma Dart 客户端,您需要在项目中创建一个 prisma/schema.prisma 文件。此文件是 Prisma 的核心文件,用于定义您的数据模型和数据库连接。

bash
bun prisma init
bash
npx prisma init
bash
pnpx prisma init

--datasource-provider 选项不是必需的,因为 Prisma Dart 客户端会自动为您生成 datasource 配置

提供程序描述示例
postgresql初始化一个 PostgreSQL 数据库npx prisma init --datasource-provider=postgresql
mysql初始化一个 MySQL 数据库npx prisma init --datasource-provider=mysql
sqlite初始化一个 SQLite 数据库npx prisma init --datasource-provider=sqlite
sqlserver初始化一个 SQL Server 数据库npx prisma init --datasource-provider=sqlserver
mongodb初始化一个 MongoDB 数据库npx prisma init --datasource-provider=mongodb
cockroachdb初始化一个 CockroachDB 数据库npx prisma init --datasource-provider=cockroachdb

初始化后,以下文件将出现在您的项目目录中

差异
...
├── prisma
│   └─── schema.prisma
└─── .env

Dart 项目依赖项

您的项目的 pubspec.yaml 文件应如下所示

yaml
name: your_project_name
description: your_project_description
dependencies:
  orm: latest
  // ...
dev_dependencies: ...

Dot env 文件 .env

.env 文件用于存储环境变量。它应如下所示

txt
# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema

# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"

Prisma 模式文件 prisma/schema.prisma

初始化后,prisma/schema.prisma 文件应如下所示

prisma
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "dart run orm"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

生成

通过运行以下命令生成 Prisma Dart 客户端

bash
bun prisma generate
bash
npx prisma generate
bash
pnpx prisma generate

这将在您定义的 output 目录中生成 Prisma Dart 客户端。

默认输出目录为 prisma/generated_dart_client/

将生成以下文件

  • client.dart - Prisma 客户端实现。
  • model.dart - 您的 Prisma 模式模型、视图和枚举。
  • prisma.dart - 自动生成的 Prisma 客户端类型。

实例化 Prisma 客户端

您可以通过导入生成的 client.dart 文件并调用 PrismaClient 构造函数来实例化 Prisma 客户端

dart
import 'prisma/generated_dart_client/client.dart';

final prisma = PrismaClient();

如果您在命令行应用程序或没有错误拦截并在抛出异常时退出进程的应用程序中使用它,我们建议将其包装在以下结构中

dart
final prisma = PrismaClient();

void main(List<String> args) async {
    try { 
        // Your code here
    } catch (e) {
        // Handle error here
    } finally {
        await prisma.$disconnect();
    }
}

为什么需要使用 finally 包装器进行 try/catch

目前,Prisma Dart 客户端仅支持 **二进制引擎**。当您执行第一个查询或调用 prisma.$connect() 时,客户端将自动启动引擎进程。当您调用 prisma.$disconnect() 时,客户端将自动关闭引擎进程。

如果您没有在应用程序中包装 try/catch,当您的应用程序抛出异常时,引擎进程将不会关闭,这将导致引擎进程一直运行,直到您在系统进程管理器中手动关闭它。

目前,我还没有找到自动关闭引擎进程的好方法。如果您有任何建议,请随时 提交问题 或为此创建一个 PR

Shelf 服务器

运行 Shelf 服务器时,您可以使用以下 main 方法优雅地处理错误并在断开 Prisma 客户端连接之前等待服务器关闭

dart
import 'package:shelf/shelf_io.dart' as io;
import 'package:shelf_docker_shutdown/shelf_docker_shutdown.dart';

Future<void> main() async{
  final prisma = PrismaClient();
  final handler = MyHandler();

  try { 
    final server = await io.serve(handler, 'localhost', 8080);
    await server.closeOnTermSignal();

    await prisma.$disconnect();
  } catch (e) {
    // Handle error here

    await prisma.$disconnect();
  } 
}

在 BSD-3-Clause 许可证下发布