正在加载,请稍候…

Prisma vs Drizzle ORM:2026 年如何选择正确的 TypeScript ORM

对比 Prisma 和 Drizzle ORM 在 TypeScript 项目中的查询 API、类型安全、迁移、性能基准测试、边缘运行时支持,以及何时选择哪个。

Prisma vs Drizzle ORM:2026 年如何选择正确的 TypeScript ORM

2026 年的 TypeScript ORM 格局

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

Prisma vs Drizzle ORM:2026 年如何选择正确的 TypeScript ORM 插图

主要差异一览

特性 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)

Prisma vs Drizzle ORM:2026 年如何选择正确的 TypeScript ORM 插图

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

Prisma vs Drizzle ORM:2026 年如何选择正确的 TypeScript ORM 插图

选择 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%。