Drizzle ORM
轻量、类型安全且贴近 SQL 的 TypeScript ORM,原生连接主流数据库驱动,并配套迁移工具。
项目概述
Drizzle ORM 允许开发者使用 TypeScript 声明数据库 Schema,并通过 SQL-like 或关系查询 API 访问数据。它支持 PostgreSQL、MySQL、SQLite、SingleStore、MSSQL 和 CockroachDB 等 SQL 数据库,适配 Node.js、Bun、Deno、Cloudflare Workers 及多种 Serverless 驱动。
Drizzle ORM 是一层贴近 SQL 的 TypeScript 数据访问库。开发者以 TypeScript 声明表、列、索引和约束,查询既可以使用类似 SQL 的 Select、Join、Where API,也可以使用带嵌套关系的 Relational Queries。它不会要求应用围绕专用数据框架组织,而是直接运行在 PostgreSQL、MySQL、SQLite、SingleStore、MSSQL、CockroachDB 等数据库的标准或平台驱动之上。核心 ORM 没有直接运行时依赖,适用于 Node.js、Bun、Deno、Cloudflare Workers、Serverless Function、Expo 和 React Native 等环境。配套的开源 Drizzle Kit 负责生成、执行、拉取和检查迁移;Drizzle Studio 可以浏览和编辑数据,但 Studio 本身不是开源项目。当前 npm 稳定版为 0.45.2,1.0 系列仍处于 RC 阶段。
主要特点
Drizzle 将类型安全放在 SQL 语义之上,并把迁移、数据库浏览和不同运行时适配拆成可选工具。
TypeScript Schema
使用 `pgTable`、`mysqlTable`、`sqliteTable` 等 API 声明列、默认值、主键、外键、索引与约束,并从同一份定义推导查询类型。
SQL-like 查询 API
Select、Insert、Update、Delete、Join、Where、Group By 等操作保持接近 SQL 的结构,熟悉 SQL 的开发者无需重新学习一套完全不同的查询语言。
Relational Queries
可以按关系加载嵌套数据并选择列、筛选和排序,适合处理常见的一对一、一对多和多对多读取。
完整 SQL Escape Hatch
`sql` 模板允许组合数据库函数、表达式、子查询和暂未封装的特性,同时保留参数绑定能力。
原生数据库驱动
直接使用 postgres.js、node-postgres、mysql2、better-sqlite3、Bun SQL、Cloudflare D1、Neon、libSQL 等驱动,不强制引入数据代理。
多数据库方言
覆盖 PostgreSQL、MySQL、SQLite、SingleStore、MSSQL 和 CockroachDB,并为各方言暴露专属列类型与能力。
Serverless-ready
支持 Node.js、Bun、Deno、Cloudflare Workers、Supabase Functions、Vercel Functions、Edge Runtime、Expo 和 React Native 等环境。
零直接运行时依赖
核心包保持轻量,数据库驱动作为可选 Peer Dependency 按项目选择,减少不相关代码和运行时组件。
Drizzle Kit 迁移工具
提供 `generate`、`migrate`、`push`、`pull`、`check`、`up`、`export` 和 `studio` 等命令。
Code-first 与 Database-first
既可从 TypeScript Schema 生成 SQL 迁移,也可反向读取现有数据库并生成 Drizzle Schema。
可审查的 SQL 迁移
生成的迁移以普通 `.sql` 文件进入版本控制,团队可以在部署前查看 DDL、补充数据迁移并走代码审查。
事务与 Savepoint
提供类型化事务 API,并支持嵌套事务的 Savepoint,便于组织多步骤写入和局部回滚。
Prepared Statements
可准备并复用参数化查询,减少重复解析开销,并为高频服务端请求提供稳定执行路径。
Drizzle Studio
通过本地代理在浏览器中查看、筛选和编辑数据库内容;ORM 与 Kit 开源,但 Studio 产品本身不开放源码。
适用场景
它适合熟悉 SQL、希望保留底层查询控制,同时需要 TypeScript 推导和 Serverless 运行能力的团队。
TypeScript API 服务
在 Node.js、Hono、Fastify、NestJS 或其他服务端框架中获得数据库 Schema、查询结果和写入参数的类型推导。
Serverless 与 Edge 应用
通过 Cloudflare D1、Neon HTTP/WebSocket、Turso/libSQL、PlanetScale 等平台驱动连接数据库,避免传统长连接假设。
Next.js 与全栈框架
在 Server Component、Route Handler、Server Action 或服务端 Loader 中使用静态类型的 SQL 查询。
现有 SQL 数据库渐进接入
使用 `drizzle-kit pull` 内省已有 Schema,再逐步将手写 SQL 或旧数据层迁移到类型化查询。
多运行时共享数据层
在 Node.js、Bun、Deno 和 Workers 项目中复用 Schema 与查询模式,同时为各部署环境选择合适驱动。
需要 SQL 控制力的复杂业务
保留 Join、CTE、聚合、窗口函数、数据库扩展和原始 SQL 表达式,而不被高层模型 API 限制。
移动端本地 SQLite
通过 Expo SQLite 或 OP-SQLite 在 Expo、React Native 中建立类型安全的离线本地数据层。
优点与注意事项
技术选型不仅要看能力,也要理解它带来的团队成本。
主要优点
Drizzle ORM 擅长的地方
- 查询结构贴近 SQL,已有 SQL 知识可以直接迁移,生成语句也较容易推断。
- Schema、查询参数和结果类型来自 TypeScript,不需要为常规查询额外生成 Client。
- 核心层轻量且没有直接运行时依赖,适合冷启动和受限的 Serverless 环境。
- 直接使用数据库或平台原生驱动,不要求额外数据代理。
- SQL-like 与 Relational Queries 并存,可按查询复杂度选择抽象层。
- 迁移是可读、可审查、可版本控制的 SQL 文件,便于数据库变更治理。
- 支持主流 SQL 方言、传统服务端、Edge、移动端和浏览器数据库场景。
- Drizzle Kit、Studio、Seed 和大量官方指南形成较完整的开发体验。
- Apache-2.0 许可证适合个人、商业和企业内部项目。
需要注意
采用前应考虑的问题
Drizzle 保留 SQL 语义,不会替你决定索引、Join、锁、隔离级别和查询计划;复杂业务仍需数据库知识。
当前稳定版为 0.45.2,1.0 仍处于 RC。不要把 RC 文档或示例直接套用到稳定版,升级前应核对变更说明。
Drizzle 不自带数据库连接层;postgres.js、pg、mysql2、better-sqlite3、D1 等驱动的连接、池化与部署限制各不相同。
Returning、事务、批处理、迁移 DDL、流式查询和数据类型支持会因数据库与驱动而异,不能假设所有示例跨方言等价。
应用层 Relations 用于关系查询,数据库 Foreign Key 用于完整性约束;只定义其中一种不会自动获得另一种保障。
`drizzle-kit push` 适合原型和受控环境;成熟生产系统应生成 SQL、审查锁表与数据影响,再由部署流程执行迁移。
重命名、拆表、回填数据、约束收紧和大表变更仍可能需要人工选择或自定义 SQL 迁移。
`sql` 模板会处理参数,但 `sql.raw`、动态标识符和手工拼接仍可能引入注入风险,外部输入不能直接进入 SQL 结构。
0.45.2 修复了 `sql.identifier()` 与 `sql.as()` 的转义问题。仍使用更早稳定版的项目应优先评估升级并检查相关查询。
超大 Schema、深层关系和复杂条件类型可能增加 TypeScript 检查时间,应拆分 Schema、限制查询选择范围并关注升级回归。
ORM 轻量不代表任意 TCP 驱动都适合 Edge。应根据平台选择 HTTP、WebSocket、D1 Binding 或连接池方案。
Drizzle ORM 与 Drizzle Kit 是开源项目,但 Studio 不开源;严格自托管或审计要求下应另选数据库管理工具。
Drizzle 面向 SQL 数据库;MongoDB 等文档数据库需要使用相应官方 Driver 或其他 ORM。
快速开始
下面以 PostgreSQL 和 postgres.js 为例,完成依赖安装、Schema、连接、查询、迁移与事务。
bashnpm install drizzle-orm postgres
npm install --save-dev drizzle-kittypescriptimport {
integer,
pgTable,
serial,
text,
timestamp,
} from "drizzle-orm/pg-core";
export const users = pgTable("users", {
id: serial("id").primaryKey(),
name: text("name").notNull(),
email: text("email").notNull().unique(),
age: integer("age"),
createdAt: timestamp("created_at", { withTimezone: true })
.defaultNow()
.notNull(),
});typescriptimport { desc, eq } from "drizzle-orm";
import { drizzle } from "drizzle-orm/postgres-js";
import postgres from "postgres";
import { users } from "./schema";
const client = postgres(process.env.DATABASE_URL!);
export const db = drizzle({ client });
const inserted = await db
.insert(users)
.values({ name: "Ada", email: "ada@example.com", age: 36 })
.returning();
const adults = await db
.select({ id: users.id, name: users.name })
.from(users)
.where(eq(users.age, 36))
.orderBy(desc(users.createdAt));typescriptimport "dotenv/config";
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql",
schema: "./src/schema.ts",
out: "./drizzle",
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});bashnpx drizzle-kit generate
# 先审查 drizzle/*.sql,再检查迁移冲突
npx drizzle-kit check
npx drizzle-kit migratetypescriptawait db.transaction(async (tx) => {
const [user] = await tx
.insert(users)
.values({ name: "Grace", email: "grace@example.com" })
.returning();
await tx.transaction(async (savepoint) => {
await savepoint
.update(users)
.set({ age: 37 })
.where(eq(users.id, user.id));
});
});bashnpx drizzle-kit studiobashnpm run lint
npm run typecheck
npm run test
npm run build
# 在预发布数据库演练迁移、回滚方案、连接池和慢查询下一步:正式项目应固定稳定版和数据库驱动版本,先决定 Code-first、Database-first 或混合迁移流程,并在上线前审查 Drizzle Kit 生成的 SQL;不要在生产环境无审核地直接执行 push。
类似项目
这些项目覆盖 Drizzle 常见的 JavaScript 运行时、Serverless 平台和托管 PostgreSQL 场景;外部项目则代表不同抽象程度的 TypeScript 数据访问方案。
Node.js
基于 V8、用于服务器、命令行工具和网络应用的跨平台 JavaScript 运行时。
查看项目Deno
默认支持 TypeScript 的安全 JavaScript、TypeScript 运行时。
查看项目Bun
集运行时、包管理器、测试与打包工具于一体的工具链。
查看项目Cloudflare Workers
在 Cloudflare 全球网络上构建、部署和扩展应用的 Serverless 计算平台。
查看项目Vercel Functions
与 Web 框架和 Vercel 部署流程深度集成的托管 Serverless 计算服务。
查看项目Supabase
围绕 PostgreSQL 构建的开源后端开发平台。
查看项目Better Auth
框架无关、类型安全的 TypeScript 认证与授权框架,提供数据库适配器、客户端 SDK 和丰富插件。
查看项目Prisma ORM
以 Prisma Schema、生成式 Client 和完整数据工具链为核心的 TypeScript ORM。
访问官网Kysely
轻量、类型安全且贴近 SQL 的 TypeScript Query Builder,保持更小的 ORM 抽象范围。
访问官网TypeORM
支持 Data Mapper 与 Active Record、Decorator 实体和多种 SQL 数据库的成熟 ORM。
访问官网Drizzle ORM vs Prisma ORM
Drizzle ORM 与 Prisma ORM 都为 TypeScript 应用提供类型安全的数据访问和迁移工具,但前者强调贴近 SQL、原生驱动与轻量运行时,后者强调独立 Schema、生成式 Client 和更高层的数据模型体验。
| 比较维度 | Drizzle ORM | Prisma ORM |
|---|---|---|
| 核心定位 | 贴近 SQL 的轻量 TypeScript ORM | 围绕数据模型与生成式 Client 的数据平台 |
| Schema 定义 | 使用 TypeScript API 定义表、列与约束 | 使用独立的 Prisma Schema Language |
| 查询风格 | SQL-like Builder 与 Relational Queries 并存 | 面向模型的 Prisma Client API |
| 类型生成 | 主要从 TypeScript Schema 直接推导,无需常规 Client Codegen | 根据 Prisma Schema 生成专用 Client 与类型 |
| 数据库连接 | 直接使用标准或平台原生驱动 | 通过 Prisma Client、Adapter 或平台连接方案访问数据库 |
| SQL 控制 | Join、CTE、表达式和 SQL 模板接近原生 SQL | 常规 CRUD 抽象更高,复杂场景可使用 TypedSQL 或 Raw Query |
| 迁移 | Drizzle Kit 生成并执行可审查 SQL,也支持 pull 与 push | Prisma Migrate 围绕 Prisma Schema 管理迁移历史 |
| 数据库范围 | 专注 PostgreSQL、MySQL、SQLite 等 SQL 数据库 | 除主流 SQL 数据库外还支持 MongoDB |
| Serverless | 核心轻量,针对 D1、Neon、libSQL 等提供专属入口 | 具备 Serverless/Edge 支持,并提供 Adapter 与托管数据产品 |
| 抽象取舍 | 需理解 SQL 与驱动差异,控制力更直接 | CRUD 与关系开发更统一,但需学习 Prisma 模型和工具链 |
| 版本成熟度 | 稳定版仍为 0.45.2,1.0 处于 RC | 已进入多个稳定大版本,生态和企业采用历史更长 |
| 更适合 | 重视 SQL 控制、轻量运行时和多 Serverless 驱动 | 偏好统一模型 API、Codegen 和完整数据平台体验 |
如果团队熟悉 SQL,希望查询结构透明、直接使用平台驱动,并在 Edge 或 Serverless 中保持轻量,优先考虑 Drizzle ORM;如果团队更重视统一的数据模型、生成式 Client、MongoDB 支持和成熟的一体化工具链,Prisma ORM 往往更合适。正式选型应使用真实 Schema、查询和部署环境做迁移与性能验证。
资料核验
版本、维护信息与本页采用的官方资料来源。
npm 官方元数据核验的稳定版为 drizzle-orm 0.45.2、drizzle-kit 0.31.10;GitHub Releases 同时提供 1.0.0 RC 预发布版本。0.45.2 修复了动态 SQL 标识符转义问题。官方仓库未归档,最近可见提交日期为 2026 年 7 月 23 日。
官方仓库未归档,核验时最近可见的代码活动日期为 2026 年 7 月 23 日。该状态表示项目近期仍有公开维护活动,不代表固定发布频率或长期支持承诺。