进阶 www.prisma.io 2026-10-12 01:56:59 · 16 阅读

第3章 Prisma ORM 8:类型化数据层与多库支持详解

Prisma ORM

Prisma ORM 是 TypeScript 的类型化数据层,为 PostgreSQL、MongoDB 和 SQLite 提供类型化的查询与迁移。

Prisma ORM 是你的 TypeScript 应用用来读写数据库的库。你在一个契约(contract,即存放模型的文件)中描述数据结构,Prisma ORM 就会为它提供类型化的查询和迁移。如果你用过 Prisma ORM 7,那么契约就相当于取代了 schema.prisma,查询的写法也有了新形式,如下面的示例所示。

Prisma ORM 8 目前是候选发布版本(release candidate),尚未正式发布,也就是今天 npm install prisma 装到的版本。它支持 PostgreSQL;MongoDB 处于早期访问(early access)阶段,部分 PostgreSQL 上可用的功能在它上面还没有;SQLite 以实验性包 @prisma/orm-sqlite 的形式提供;MySQL、SQL Server 和 CockroachDB 稍后推出,在此之前由 Prisma ORM 7 提供支持。关于早期访问和实验性分别意味着什么,以及每个数据库支持哪些功能,见 Supported databases。

下面是一个包含两个模型的契约、一个读取它们的查询,以及查询在存有两个用户和两篇文章的数据库上打印的结果。契约的第一行 // use prisma-8 是必需的,安装命令会帮你写好。db 从 src/prisma/db.ts 导出,该文件读取 DATABASE_URL 并创建客户端。对于新应用,npm create prisma@latest 会生成这两个文件;对于已有应用,用 npx prisma@latest orm init 生成。在 "Start here" 下的某个页面创建了数据表之后,用 npx tsx index.ts 运行查询文件。

src/prisma/contract.prisma // use prisma-8

model User { id Int @id @default(autoincrement()) email String @unique name String? posts Post[] }

model Post { id Int @id @default(autoincrement()) title String author User @relation(fields: [authorId], references: [id]) authorId Int }

index.ts import { db } from "./src/prisma/db";

const users = await db.orm.public.User.include("posts").all(); console.dir(users, { depth: null });

await db.close();

Output [ { email: 'alice@example.com', id: 1, name: 'Alice', posts: [ { authorId: 1, id: 1, title: 'Hello, world' }, { authorId: 1, id: 2, title: 'Second post' } ] }, { email: 'bob@example.com', id: 2, name: 'Bob', posts: [] } ]

结果中的每个字段都有来自契约的类型,精确到每篇文章的 title。db.orm 存放着针对你的模型的类型化查询,public 是数据表所在的 PostgreSQL schema,除非你另外创建了 schema,否则就是默认的这个。修改契约后,运行 npx prisma contract emit。它取代了 prisma generate,也不再需要 @prisma/client 包:你的代码直接从 src/prisma/db.ts 导入 db。

Start here

根据你的起点选择对应的页面。每个页面都以 PostgreSQL 为例,并附上对应的 MongoDB 版本链接。

创建新应用:从模板创建应用并运行第一个查询。

已有应用但还没有数据库:在你的应用中加入 Prisma ORM,创建数据表并应用第一次迁移。

已有数据库:从现有数据表生成契约,然后以迁移的形式对表做第一次修改。

已有 Prisma 7 应用:在同一个应用中、同一个数据库上,把 Prisma ORM 8 安装到 Prisma ORM 7 旁边,然后逐个部分地迁移。

Prisma ORM 能做什么

- 建模数据:描述你的模型、字段以及它们之间的关联。 - 读写数据:查询、过滤、排序、分页记录,以及创建、更新、删除。 - 查询关联:用 .include(...) 在同一次查询中读取关联记录。 - 执行事务:让多次写入要么全部成功、要么一起失败。 - 迁移数据库:修改契约并运行 npx prisma contract emit 之后,npx prisma migration plan 会生成迁移供你审查。npx prisma db migrate --advance-ref db 随后将其应用到开发数据库并做好记录,下一次生成迁移时会以此为基础。这两条命令取代了 prisma migrate dev。 - 添加中间件:在每次查询前后运行你自己的代码,比如记录每条查询的日志。它同时取代了 $use 和 $extends。 - 使用扩展:添加 PostgreSQL 的特性,如向量搜索、地理空间数据和全文搜索。这些是数据库扩展,不是 Prisma ORM 7 的 $extends。 - 使用 CLI:运行 npx prisma 命令来管理契约、数据库和迁移。

从 Prisma ORM 7 迁移

Coming from Prisma ORM 7 是一份对照表:列出 Prisma ORM 7 中的每个 schema 属性、命令和查询在 Prisma ORM 8 中的对应叫法。如果要迁移正在运行的应用,请按上面的"已有 Prisma 7 应用"操作,并在此过程中参考该表。

发布状态

今天 npm install prisma 装到的就是 Prisma ORM 8。如果你的应用还在 Prisma ORM 7 上并希望保持不动,请在 package.json 中把 prisma 和 @prisma/client 锁定到版本 7,具体见 Release status。那个页面还列出了正式版的发布日期,以及 Prisma ORM 7 在此之后的支持期限。

在 GitHub 上编辑本文

核心概念

Prisma ORM 8 如何组合在一起,按你接触的顺序介绍:契约、contract emit 生成的文件、数据库签名、查询和迁移。

评论 (0)