
2026 年的 TypeScript ORM 格局
Prisma 早期占据主导地位,但 Drizzle ORM 因其轻量级、SQL 优先的方法而获得了大量采用。

主要差异一览
| 特性 | Prisma | Drizzle |
|---|---|---|
| 模式定义 | .prisma 文件 | TypeScript |
| 查询风格 | 流畅 API | 类似 SQL |
| 打包大小 | ~2MB(含引擎) | ~30KB |
| 边缘支持 | 有限 | 完整 |
| 生成的 SQL | 隐藏 | 可见 |
| 类型推断 | 优秀 | 优秀 |
| 关系处理 | 直观 | 手动 |
Drizzle ORM 基础
// schema.ts — 用 TypeScript 定义
import { pgTable, text, integer, timestamp, uuid, boolean } from 'drizzle-orm/pg-core'
import { relations } from 'drizzle-orm'
export const users = pgTable('users', {
id: uuid('id').defaultRandom().primaryKey(),
name: text('name').notNull(),
email: text('email').notNull().unique(),
role: text('role', { enum: ['user', 'admin'] }).default('user'),
createdAt: timestamp('created_at').defaultNow(),
})
export const posts = pgTable('posts', {
id: uuid('id').defaultRandom().primaryKey(),
title: text('title').notNull(),
content: text('content'),
published: boolean('published').default(false),
authorId: uuid('author_id').references(() => users.id, { onDelete: 'cascade' }),
createdAt: timestamp('created_at').defaultNow(),
})
// 定义关系
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}))
export const postsRelations = relations(posts, ({ one }) => ({
author: one(users, { fields: [posts.authorId], references: [users.id] }),
}))
Drizzle 查询
import { drizzle } from 'drizzle-orm/postgres-js'
import { eq, desc, like, and, count, sql } from 'drizzle-orm'
import postgres from 'postgres'
import * as schema from './schema'
const connection = postgres(process.env.DATABASE_URL!)
const db = drizzle(connection, { schema })
// 带关系的查找
const usersWithPosts = await db.query.users.findMany({
where: eq(users.role, 'admin'),
with: {
posts: {
where: eq(posts.published, true),
orderBy: [desc(posts.createdAt)],
limit: 5,
},
},
})
// 复杂查询 — 看起来像 SQL
const results = await db
.select({
userId: users.id,
name: users.name,
postCount: count(posts.id),
})
.from(users)
.leftJoin(posts, eq(posts.authorId, users.id))
.where(and(
eq(users.role, 'user'),
like(users.email, '%@example.com'),
))
.groupBy(users.id, users.name)
.having(sql`count(${posts.id}) > 5`)
.orderBy(desc(count(posts.id)))
.limit(20)

Drizzle 迁移
// drizzle.config.ts
export default {
schema: './src/schema.ts',
out: './drizzle',
driver: 'pg',
dbCredentials: { connectionString: process.env.DATABASE_URL! },
}
drizzle-kit generate:pg # 生成迁移 SQL
drizzle-kit push:pg # 直接推送模式(仅开发环境)
drizzle-kit studio # 可视化模式浏览器
Prisma vs Drizzle:何时选择
选择 Prisma 当:
- 团队对 TypeScript ORM 不熟悉
- 你想要神奇的关系处理
- 你使用 Prisma Studio 进行数据探索
- 你需要支持 PostgreSQL、MySQL、SQLite、MongoDB

选择 Drizzle 当:
- 运行在边缘运行时(Cloudflare Workers、Vercel Edge)
- 打包大小很重要(Drizzle 小 60 倍)
- 你想要完全的 SQL 控制/可见性
- 构建高性能 API
- 使用 Turso 或 PlanetScale
使用 Drizzle 的边缘运行时
// 在 Cloudflare Workers 上工作!
import { drizzle } from 'drizzle-orm/d1'
export default {
async fetch(request: Request, env: Env) {
const db = drizzle(env.DB) // Cloudflare D1(边缘 SQLite)
const users = await db.select().from(schema.users).limit(10)
return Response.json(users)
},
}
性能基准测试(简单 SELECT)
| ORM | 查询/秒 |
|---|---|
| 原始 SQL (pg) | 18,000 |
| Drizzle | 16,500 |
| Prisma | 9,000 |
| TypeORM | 7,000 |
| Sequelize | 5,000 |
Drizzle 比原始 SQL 增加约 8% 的开销;Prisma 增加约 100%。