10.1 为什么要迁
- Edge / Workers 部署需求——Prisma 直到 2024 年后才有较好支持,且体积仍大
- 查询表达力不足——
$queryRaw满天飞 - generate 步骤拖累 CI + monorepo 类型传播慢
- Drizzle 运行时体积 7KB,schema 即 TS
10.2 关键差异对照
| Prisma | Drizzle | |
|---|---|---|
| Schema | schema.prisma DSL | TypeScript(pgTable/...) |
| 代码生成 | prisma generate 步骤 | ❌ 无 |
| 查询 API | prisma.user.findMany({ where, include }) | db.select().from(u).where() / db.query.users.findMany({ with }) |
| 关系 | Schema 里 @relation | relations() 单独声明 |
| 迁移 | prisma migrate dev / deploy | drizzle-kit generate / migrate |
| 原始 SQL | $queryRaw | sql 模板 / db.execute |
| 事务 | prisma.$transaction([...]) | db.transaction(async tx => ...) |
| GUI | Prisma Studio | Drizzle Studio |
10.3 七步迁移清单
① 并存安装
$ npm i drizzle-orm postgres
$ npm i -D drizzle-kit
不立即卸 Prisma——两套先共存。
② 用官方 generator 从 Prisma schema 生成 Drizzle schema
$ npx drizzle-prisma-generator
# 读 prisma/schema.prisma,产出等价 src/db/schema.ts
③ 对齐一份 drizzle.config.ts
export default defineConfig({
dialect: "postgresql",
schema: "./src/db/schema.ts",
out: "./drizzle",
dbCredentials: { url: process.env.DATABASE_URL! },
});
④ 让 Drizzle 同步现有库
$ npx drizzle-kit pull # 从现有库反向产生 schema baseline
# 或比对你手头的 schema.ts,生成一次"空 diff"的初始迁移
⑤ 按模块逐步迁代码
// 旧:Prisma
const user = await prisma.user.findUnique({ where: { id } });
// 新:Drizzle
const user = await db.query.users.findFirst({ where: (u, { eq }) => eq(u.id, id) });
每次迁移一个模块/仓库文件,独立 commit——review 单位小。
⑥ 卸载 Prisma 依赖
$ npm uninstall prisma @prisma/client
$ rm -rf prisma/
⑦ 校验
- 全链路单元 + 集成测试
- staging 环境跑一周
- 生产切量前先让两套并行查同一个库,对比结果
10.4 drizzle-zod:自动生成 Zod schema
$ npm i drizzle-zod zod
import { createInsertSchema, createSelectSchema } from "drizzle-zod";
export const insertUserSchema = createInsertSchema(users, {
// 自定义每列验证
email: (s) => s.email.email(),
age: (s) => s.age.min(0).max(150),
});
export const selectUserSchema = createSelectSchema(users);
// Express/Hono 里直接用
const input = insertUserSchema.parse(req.body);
await db.insert(users).values(input);
10.5 drizzle-seed:灌测试数据
$ npm i -D drizzle-seed
import { seed, reset } from "drizzle-seed";
await reset(db, schema);
await seed(db, schema).refine((f) => ({
users: {
count: 100,
columns: {
name: f.fullName(),
email: f.email(),
},
},
posts: { count: 500 },
}));
10.6 drizzle-valibot / drizzle-typebox
同样的"从 schema 生成校验器",换成 valibot 或 typebox 作为目标——选用你项目已用的验证库即可。
10.7 OpenAPI / tRPC 集成
- ElysiaJS:配 drizzle-typebox,自动把 Drizzle schema 变成 API schema + OpenAPI 文档。
- Hono + Zod OpenAPI:配 drizzle-zod,路由声明里直接用生成的 schema。
- tRPC:
input(insertUserSchema),类型一路端到端贯通。
10.8 性能调优清单
- 索引审计:
EXPLAIN ANALYZE慢查询,对 where/join 列建索引。 - prepared statement:热路径
.prepare()。 - select 列缩减:只取需要字段,减少网络传输。
- Relational Queries 替代 N 次单查:避免 N+1。
- 批量插入:
.values([...])一次性。 - 连接池大小:Postgres max_connections 和应用 pool max 匹配。
- Edge 用 HTTP driver,避免每请求新 TCP。
- 事务尽短:不做 HTTP / 外部调用。
- JSON 列加 GIN 索引(PG),避免全表扫。
- drizzle-kit push 只用于本地原型,别碰生产。
10.9 全书总结
- Schema 即 TypeScript——无需 DSL、无需代码生成,改完 IDE 立刻知道新类型。
- 两层 API:
db.select().from().where()接近 SQL;db.query.users.findMany({ with })做嵌套关系。 - drizzle-kit 处理迁移:
generate生成 SQL、migrate应用、push原型、pull反向、studioGUI。 - 7KB 零依赖——跑在 Workers/Deno/Bun/Vercel Edge/Lambda 等所有 JS 运行时。
- 生态丰富:
drizzle-zod/drizzle-seed/drizzle-prisma-generator/Drizzle Studio。 - 从 Prisma 迁移平滑:自动生成 schema、按模块替换查询、对比测试后下线。
至此 10 章完成。Drizzle 正在成为 2026 年 TypeScript 项目的事实标准 ORM——越早切越能吃到 Edge、类型安全、生态聚合的红利。祝你 schema 零魔法、查询零意外、部署跑全世界。