首页 / Prisma ORM 入门教程 / Client 的生成、导入与生命周期

Prisma ORM 入门教程

Client 的生成、导入与生命周期

本教程共 54 篇 · 第 17 篇 · 更新于 2026-08-11 · 约 5 分钟阅读

Prisma Clientprisma generateDriver Adapters单例模式ESM连接生命周期

本节目标:搞懂 Prisma Client 从哪来、怎么导入、如何实例化,以及数据库连接什么时候建立。

Prisma Client 不是手写的类。它由 schema.prisma 自动生成,代码与你的模型一一对应。模型改一点,Client 就要重新生成一次。这一节把「生成 → 导入 → 实例化 → 连接」整条链路走一遍。

生成:prisma generate

先在 Schema 中声明生成器(generator):

generator client {
  provider = "prisma-client"
  output   = "../src/generated/prisma"
}

v7 有两个强制要求:provider 必须是 prisma-client(旧写法 prisma-client-js 已废弃);output 必须显式写出。生成器把客户端代码写到 output 目录,不再塞进 node_modules。

然后运行:

npx prisma generate

什么时候要重新生成?改了 Schema、改了生成器配置、启用了影响 Client API 的功能,以及拉取了队友的 Schema 改动之后。v7 里 migrate dev 不再自动 generate,改完模型记得手动跑一次。

Tip

可以把 prisma generate 挂到 package.json 的 postinstall 脚本,部署时自动执行,保证生成代码不过期。开发时也能用 npx prisma generate --watch,监听 Schema 变化自动重新生成。

导入:从 output 路径导入

生成产物在你指定的目录,导入也从那里来:

import { PrismaClient } from "./generated/prisma/client";

v7 不再支持从 @prisma/client 包导入旧客户端。output 目录是生成物,建议加进 .gitignore。想要干净的包名,可以执行 npm add db@./generated/prisma 把目录链接成依赖,之后写 import { PrismaClient } from "db" 即可。

连接:Driver Adapters(v7 强制)

Prisma 7 不再内置二进制查询引擎,改为通过驱动程序适配器(Driver Adapters)连接数据库。一条查询的旅程是:你的代码 → Prisma Client → 适配器 → JavaScript 数据库驱动 → 数据库。适配器相当于 Prisma Client 与驱动之间的翻译官,Prisma 官方为每种数据库维护一个。

常用适配器:

数据库底层驱动适配器包
PostgreSQLpg@prisma/adapter-pg
SQLitebetter-sqlite3@prisma/adapter-better-sqlite3
MySQL / MariaDBmariadb@prisma/adapter-mariadb
SQL Servernode-mssql@prisma/adapter-mssql
Turso(libSQL)libSQL@prisma/adapter-libsql

无服务器环境还有走 HTTP/WebSocket 的适配器:Neon、PlanetScale、Cloudflare D1、Prisma Postgres。换适配器相当于换翻译官,查询代码一行不用动。

PostgreSQL 的安装组合:

npm install @prisma/client @prisma/adapter-pg pg

实例化必须传 adapter,否则直接报错:

import "dotenv/config";
import { PrismaClient } from "./generated/prisma/client";
import { PrismaPg } from "@prisma/adapter-pg";

const adapter = new PrismaPg({
  connectionString: process.env.DATABASE_URL!,
});

export const prisma = new PrismaClient({ adapter });

SQLite 同理,只是驱动换成 better-sqlite3:

import { PrismaClient } from "./generated/prisma/client";
import { PrismaBetterSqlite3 } from "@prisma/adapter-better-sqlite3";

const adapter = new PrismaBetterSqlite3({ url: "file:./dev.db" });
const prisma = new PrismaClient({ adapter });

注意配置分工:CLI 工具(迁移、Studio)用的连接地址写在 prisma.config.ts 的 datasource.url;应用代码里 adapter 自己拿连接字符串,两处都要配。

Note

MongoDB 在 v7 不受支持。用 MongoDB 请停留在 v6.19 分支。

实例化:单例模式

一个进程通常只创建一个 PrismaClient 实例。多建实例等于多开连接池,容易把数据库连接数打满,报「too many clients already」错误,数据库也会被拖慢。

长期运行的服务,在模块顶层导出即可。开发时热重载会反复执行模块,每次执行都 new 一个实例就会泄漏连接,所以要挂到 globalThis 上:

import { PrismaClient } from "./generated/prisma/client";
import { PrismaPg } from "@prisma/adapter-pg";

const globalForPrisma = globalThis as unknown as {
  prisma: PrismaClient | undefined;
};

const adapter = new PrismaPg({
  connectionString: process.env.DATABASE_URL!,
});

export const prisma =
  globalForPrisma.prisma ?? new PrismaClient({ adapter });

if (process.env.NODE_ENV !== "production") {
  globalForPrisma.prisma = prisma;
}

生命周期:懒连接

new PrismaClient() 只创建对象,不建立连接。第一条查询发出时才真正连库,这叫懒连接(lazy connection)。普通场景不用管它,Prisma 内部会打理连接池。

需要提前连接时(比如启动时做健康检查),显式调用:

await prisma.$connect();

服务优雅关闭时调用 $disconnect(),把连接归还数据库。进程自然退出时 Prisma 也会自动收尾,但显式断开更可控,Node 服务常在 SIGTERM 信号里做这一步:

process.on("SIGTERM", async () => {
  await prisma.$disconnect();
  process.exit(0);
});

参考来源

  • Prisma 官方文档:Introduction to Prisma Client
  • Prisma 官方文档:Generating Prisma Client
  • Prisma 官方文档:Database drivers(Driver Adapters)
  • Mapagam:Generating and Configuring Prisma Client / Instantiating Prisma Client