Chapter 10

从 Prisma 迁移与进阶

一步步把现有 Prisma 项目迁到 Drizzle,同时掌握生态中最有用的几个周边库。

10.1 为什么要迁

10.2 关键差异对照

PrismaDrizzle
Schemaschema.prisma DSLTypeScript(pgTable/...)
代码生成prisma generate 步骤❌ 无
查询 APIprisma.user.findMany({ where, include })db.select().from(u).where() / db.query.users.findMany({ with })
关系Schema 里 @relationrelations() 单独声明
迁移prisma migrate dev / deploydrizzle-kit generate / migrate
原始 SQL$queryRawsql 模板 / db.execute
事务prisma.$transaction([...])db.transaction(async tx => ...)
GUIPrisma StudioDrizzle 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/

⑦ 校验

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 集成

10.8 性能调优清单

  1. 索引审计:EXPLAIN ANALYZE 慢查询,对 where/join 列建索引。
  2. prepared statement:热路径 .prepare()
  3. select 列缩减:只取需要字段,减少网络传输。
  4. Relational Queries 替代 N 次单查:避免 N+1。
  5. 批量插入:.values([...]) 一次性。
  6. 连接池大小:Postgres max_connections 和应用 pool max 匹配。
  7. Edge 用 HTTP driver,避免每请求新 TCP。
  8. 事务尽短:不做 HTTP / 外部调用。
  9. JSON 列加 GIN 索引(PG),避免全表扫。
  10. drizzle-kit push 只用于本地原型,别碰生产。

10.9 全书总结

至此 10 章完成。Drizzle 正在成为 2026 年 TypeScript 项目的事实标准 ORM——越早切越能吃到 Edge、类型安全、生态聚合的红利。祝你 schema 零魔法、查询零意外、部署跑全世界。