1.1 ORM 是什么
ORM(Object-Relational Mapping,对象关系映射)是一类库,帮你在"面向对象的代码"与"关系型数据库的表"之间搭桥——免手写 SQL、免手拼字符串、免担心 SQL 注入,并让 IDE 能对查询做类型检查。
- ORM(对象关系映射)
- 把数据库的行、列映射为编程语言里的对象与属性。Prisma 属于新一代 ORM,强调类型安全与开发体验。
- schema-first(模式优先)
- 先在一份声明式文件里定义数据模型,再由工具据此生成代码/迁移。Prisma 用
schema.prisma走这条路线,与 code-first(先写代码类再生成表)相对。 - Prisma Client
- 由
prisma generate生成的类型安全查询客户端,暴露prisma.user.findMany()式 API,入参出参全类型推断。 - Prisma Migrate
- 声明式迁移工具。你改 schema,它 diff 出 SQL 并生成迁移文件,开发用
migrate dev,生产用migrate deploy。 - Prisma Studio
- 内置的浏览器可视化 GUI,浏览/编辑/筛选表数据、沿关系跳转,本地开发调试极方便。
- 查询引擎(Query Engine)
- Prisma Client 底层的执行组件,负责把类型安全调用翻译为 SQL。历史上是 Rust 二进制,新版提供纯 JS/WASM 引擎(
driverAdapters)以适配 Edge/Serverless。
1.2 Prisma 三件套
Prisma 不是单个库,而是围绕 schema.prisma 的一组工具协同工作:
- Prisma Client(
@prisma/client,运行时依赖):应用代码里 import 它做查询。 - Prisma CLI(
prisma,开发依赖):提供init/generate/migrate/studio/db push等命令。 - Prisma Migrate 与 Studio:都是 CLI 的子命令,前者管迁移、后者启可视化 GUI。
心智模型
schema.prisma 是单一事实来源(single source of truth)。改它 → generate 更新 Client 类型 → migrate 同步数据库结构。三步始终围绕这一份文件。
1.3 Prisma vs Drizzle vs TypeORM
| 维度 | Prisma | Drizzle | TypeORM |
|---|---|---|---|
| Schema 语法 | 专用 DSL(schema.prisma) | TypeScript | Decorator 类 |
| 代码生成 | ✅ 需要 generate | ❌ 不需要 | ❌ |
| 运行时体积 | 较重(含引擎) | 7KB | ~10MB |
| Edge 支持 | driverAdapters/Accelerate | ✅ 原生 | ❌ |
| 迁移工具 | Prisma Migrate(强) | drizzle-kit | typeorm migration |
| 可视化 GUI | ✅ Studio(成熟) | Drizzle Studio | ❌ |
| SQL 表达力 | 中(难的用 $queryRaw) | 高(接近原生) | 中 |
| MongoDB | ✅ 支持 | ❌ | ✅ |
| 学习曲线 | 低(DSL 直观) | 低(懂 SQL 即可) | 中 |
如何选
• 团队协作、追求开发体验与成熟迁移/GUI → Prisma
• 追求轻量、贴近 SQL、上 Edge → Drizzle
• 老项目已用 decorator 风格 → TypeORM
1.4 支持的数据库
| 数据库 | provider 值 | 说明 |
|---|---|---|
| PostgreSQL | postgresql | 功能最全,首选 |
| MySQL / MariaDB | mysql | 通用 |
| SQLite | sqlite | 本地/原型/测试 |
| MongoDB | mongodb | 文档数据库,语法略有差异 |
| SQL Server | sqlserver | 企业环境 |
| CockroachDB | cockroachdb | 分布式 Postgres 兼容 |
1.5 安装与初始化
# 安装 CLI(开发依赖)与 Client(运行时)
$ npm i -D prisma
$ npm i @prisma/client
# 初始化:默认 postgresql,也可指定其他 provider
$ npx prisma init --datasource-provider postgresql
prisma init 会生成两个文件:prisma/schema.prisma(模型定义)与 .env(含 DATABASE_URL)。
1.6 schema.prisma 骨架
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
createdAt DateTime @default(now())
}
# .env
DATABASE_URL="postgresql://user:pass@localhost:5432/mydb?schema=public"
1.7 生成 Client 与建表
# 根据 schema 生成类型安全 Client 到 node_modules/.prisma/client
$ npx prisma generate
# 首次迁移:创建表并生成迁移文件
$ npx prisma migrate dev --name init
别忘了 generate
每次改完 schema.prisma 都要重新 prisma generate(migrate dev 会自动触发一次),否则 Client 类型与 schema 不同步,IDE 报错或类型过期。
1.8 第一次查询:Hello Prisma
// src/db.ts —— 单例 PrismaClient(详见第 9 章)
import { PrismaClient } from "@prisma/client";
export const prisma = new PrismaClient();
// src/app.ts
import { prisma } from "./db";
async function main() {
await prisma.user.create({
data: { email: "alice@example.com", name: "Alice" },
});
const users = await prisma.user.findMany();
console.log(users);
// [{ id: 1, email: "alice@example.com", name: "Alice", createdAt: ... }]
}
main().finally(() => prisma.$disconnect());
注意类型推断
users 的类型自动为 User[]——完全来自生成的 Client。若 create 时漏传必填的 email,TypeScript 会在编译期报错。
1.9 切换到 MySQL / SQLite
// MySQL:只需改 provider 与 url
datasource db {
provider = "mysql"
url = env("DATABASE_URL") // mysql://user:pass@host:3306/db
}
// SQLite:本地文件即可,无需装数据库
datasource db {
provider = "sqlite"
url = "file:./dev.db"
}
1.10 小结与下一步
- Prisma = schema-first ORM,围绕 schema.prisma 展开三件套:Client(查询)/ Migrate(迁移)/ Studio(GUI)。
- 工作流:改 schema →
generate更新类型 →migrate同步数据库。 - 相比 Drizzle 需 DSL 与代码生成、运行时更重,但开发体验、迁移与 GUI 更成熟。
- 下一章深入 schema.prisma 建模——把模型、字段类型、属性、枚举讲透。