Drizzle ORM:TypeScript 生态中冉冉升起的数据库工具链引言

张开发
2026/6/7 19:36:01 15 分钟阅读

分享文章

Drizzle ORM:TypeScript 生态中冉冉升起的数据库工具链引言
一、什么是 Drizzle ORMDrizzle ORM 是一个面向 TypeScript 的轻量级数据库工具链它同时具备Schema 定义能力——用纯 TypeScript 声明表结构Query Builder——链式 API 构建 SQL 查询Migration 工具——基于 Schema 差异自动生成迁移文件类型安全贯穿全链路——从 Schema 定义到查询结果TypeScript 编译器全程保驾护航与 Prisma 的自定义 Schema 语言.prisma 文件不同Drizzle 回归了一切皆 TypeScript 代码的理念开发者无需学习额外的 DSL也无需引入代码生成步骤。二、核心优点1. 零代码生成极致编译速度Prisma 需要 prisma generate 将 Schema 编译为客户端代码项目越大耗时越长。Drizzle 完全跳过这一步——Schema 本身就是 TypeScript 代码类型推导由 TypeScript 编译器原生完成无需中间层。2. SQL 优先不隐藏底层Drizzle 的查询 API 与原生 SQL 几乎一一映射// Drizzle 查询 db.select().from(users).where(eq(users.email, testexample.com)); // 对应的 SQL // SELECT * FROM users WHERE email testexample.com;对于熟悉 SQL 的开发者几乎没有心智负担。遇到复杂查询时还可以直接嵌入原生 SQL 片段不会被 ORM 的抽象层束缚。3. 运行时极致轻量Drizzle 的核心包体积极小gzip 后约 7KB冷启动几乎不增加额外延迟。相比之下Prisma Client 动辄数 MB 的运行时在 Serverless 环境下可能成为性能瓶颈。4. 多数据库统一接口Drizzle 支持 PostgreSQL、MySQL、SQLite、PlanetScale、Neon、Turso、Cloudflare D1 等主流数据库切换数据库只需更换对应的驱动适配器Schema 和查询语法保持一致。5. 关系查询的类型推导Drizzle 的 relations API 能自动推导出关联数据的嵌套类型。来看一个直观对比// 定义关系 const usersRelations relations(users, ({ many }) ({ posts: many(posts), })); // 查询用户及其所有文章——结果类型自动推导为 { id, name, posts: Post[] } const result await db.query.users.findMany({ with: { posts: true }, }); // result[0].posts 的类型自动推导无需手动声明6. Drizzle Kit可视化的数据库管理Drizzle Kit 是配套的 CLI 工具提供Introspect从已有数据库反向生成 TypeScript SchemaGenerate对比 Schema 变更自动生成 SQL 迁移文件Push直接将 Schema 变更应用到数据库适合开发阶段快速迭代Studio内置的数据库可视化管理面板npx drizzle-kit studio三、适用场景场景说明Serverless 应用轻量运行时不拖累冷启动适配 Cloudflare Workers / AWS Lambda 等边缘计算原生支持 Cloudflare D1、Turso 等边缘数据库类型敏感型项目追求全链路类型安全希望编译期拦截 SQL 错误SQL 经验丰富的团队不想被 ORM 屏蔽 SQL 细节需要灵活拼接复杂查询微服务 / 中小型项目Schema 不复杂但需要高效率开发讨厌代码生成环节已有数据库的项目通过 Introspect 反向生成 Schema渐进式引入暂不适合的场景团队完全不懂 SQL、需要 ORM 完全隐藏数据库细节此时 Prisma 的抽象层更友好。四、具体使用方式环境准备# 初始化项目 npm init -y npm install drizzle-orm better-sqlite3 npm install -D drizzle-kit types/better-sqlite3第一步定义 Schema创建 src/db/schema.tsimport { sqliteTable, text, integer } from drizzle-orm/sqlite-core; export const users sqliteTable(users, { id: integer(id).primaryKey({ autoIncrement: true }), name: text(name).notNull(), email: text(email).notNull().unique(), createdAt: integer(created_at, { mode: timestamp }) .notNull() .default(sql(unixepoch())), }); export const posts sqliteTable(posts, { id: integer(id).primaryKey({ autoIncrement: true }), title: text(title).notNull(), content: text(content).notNull(), authorId: integer(author_id) .notNull() .references(() users.id), publishedAt: integer(published_at, { mode: timestamp }), });第二步定义关系可选但推荐在 src/db/schema.ts 中追加import { relations, sql } from drizzle-orm; export const usersRelations relations(users, ({ many }) ({ posts: many(posts), })); export const postsRelations relations(posts, ({ one }) ({ author: one(users, { fields: [posts.authorId], references: [users.id], }), }));第三步初始化数据库连接创建 src/db/index.tsimport { drizzle } from drizzle-orm/better-sqlite3; import Database from better-sqlite3; import * as schema from ./schema; const sqlite new Database(local.db); export const db drizzle(sqlite, { schema });第四步执行迁移# 生成迁移文件 npx drizzle-kit generate # 执行迁移 npx drizzle-kit push第五步编写业务代码import { db } from ./db; import { users, posts } from ./db/schema; import { eq, and, like, desc } from drizzle-orm; // 插入用户 const [newUser] await db.insert(users).values({ name: 张三, email: zhangsanexample.com, }).returning(); // 查询全链路类型推导 const allUsers await db.select().from(users); // 条件查询 const matched await db.select() .from(users) .where(like(users.name, %张%)); // 联表查询利用 relations const usersWithPosts await db.query.users.findMany({ with: { posts: true }, where: eq(users.name, 张三), }); // usersWithPosts[0].posts 类型自动推导为 Post[] // 更新 await db.update(users) .set({ name: 张三丰 }) .where(eq(users.id, newUser.id)); // 删除 await db.delete(posts).where(eq(posts.id, 1));第六步使用 Drizzle Studio 可视化npx drizzle-kit studio浏览器打开 https://local.drizzle.studio即可在图形界面中浏览和编辑数据。五、与主流方案对比维度Drizzle ORMPrismaTypeORMKnexSchema 定义TypeScript 原生自定义 DSL装饰器/代码无 Schema 层代码生成不需要需要需要不需要类型安全全链路强生成后中等弱SQL 控制力极高中中极高运行时体积~7KB~5MB~1MB~200KB学习曲线平缓懂 SQL 即上手需要学 DSL陡峭平缓Edge Runtime原生支持部分支持不支持支持六、总结Drizzle ORM 的出现改变了 TypeScript 数据库工具链的格局。它在类型安全与贴近 SQL之间找到了精准的平衡点不像 Prisma 那样试图用抽象层包裹一切也不像 Knex 那样完全放弃类型推导。对于追求轻量、极速、类型安全且对 SQL 有基本掌握的团队Drizzle ORM 是一个值得在生产环境投入的选择。它的生态仍在快速演进中——Drizzle Kit Studio、Seeding 工具、Zod Schema 联动等周边能力正持续完善。如果你正在新建一个 TypeScript 后端项目不妨给它 30 分钟尝试一次 drizzle-kit introspect 或从零建一个 Schema——那种写 TypeScript 就是写 Schema的流畅感试过就很难回去了。

更多文章