核心用法
Drizzle ORM 是一套以 TypeScript 为核心的数据库工具链,包含 ORM 本体 (drizzle-orm) 和迁移 CLI (drizzle-kit)。其核心设计理念是"SQL 优先、类型安全"——开发者使用熟悉的 SQL 风格函数(如 eq()、gt()、and())构建查询,同时获得完整的 TypeScript 类型推导。
Schema 定义:需显式导出每个表,使用 $inferSelect 和 $inferInsert 分别推导查询返回类型和插入输入类型。关系定义通过独立的 relations() 调用完成,与表结构分离。需按数据库驱动选择正确的核心导入(pg-core/mysql-core/sqlite-core),混用会导致运行时错误。
查询模式:关系型查询使用 db.query.users.findMany() 配合 with 参数,SQL 风格查询使用 db.select().from(),两者不可混用。条件组合必须使用函数式写法(and(eq(...), gt(...))),而非 Prisma 风格的配置对象。
迁移策略:开发环境可用 drizzle-kit push 快速同步,生产环境必须使用 generate + migrate 的安全流程。strict: true 配置可在部署前捕获 schema 漂移。
显著优点
- 编译时类型安全:从 schema 到查询结果完整推导,重构时捕获破坏性变更
- SQL 原生体验:函数式语法贴近手写 SQL,无 DSL 学习成本,便于优化复杂查询
- 驱动级精确控制:按数据库类型隔离核心代码,避免跨驱动抽象泄漏
- 零运行时魔法:生成的查询可预测,无隐式 N+1 查询或自动批处理副作用
- 迁移工作流成熟:支持推模式开发、生成模式部署,配置
strict防漂移
潜在局限
- 陡峭迁移成本:Prisma 用户需彻底转换思维模型(对象配置 → 函数组合)
- 手动优化必需:无自动查询批处理或 N+1 防护,开发者需显式使用
db.transaction()和.prepare() - 文档碎片化:驱动特定 API(如 PostgreSQL 的
jsonbvs MySQL 的json)易混淆 - 调试体验:类型错误提示有时指向生成的 SQL 而非 TypeScript 源码位置
- 生态成熟度:相比 Prisma,可视化工具、数据库客户端集成等周边生态仍在建设中
适合人群
- 熟悉 SQL、追求查询可预测性的后端开发者
- 需要精细控制数据库访问模式的性能敏感型应用
- 从其他 ORM 迁移、愿意接受短期学习成本换取长期类型安全的团队
- 多数据库驱动项目(需严格隔离 PostgreSQL/MySQL/SQLite 代码路径)
常规风险
- Promise 遗忘陷阱:
await缺失时返回 Promise 对象,TypeScript 在忽略返回值时无法报错 - 返回数据遗漏:插入/更新后忘记
.returning()只能拿到rowCount,无法获取生成字段 - 静默查询失败:schema 文件未导出表时查询失败无错误提示
- 运行时驱动错误:编译通过的跨驱动导入(如 pg 表用 mysql 函数)在运行时抛 cryptic 错误
- 无默认分页:
findMany()和select()无limit()时触发全表扫描,大表场景极易造成事故