Drizzle ORM vs Prisma:为什么 Drizzle 是 2024 年的首选

0 阅读1分钟

目录 (Outline)


一、 ORM 的演进:从「重度抽象」到「原生回归」

1. 历史局限

传统的 ORM(如 TypeORM、Sequelize)试图完全隐藏 SQL 细节。

  • 过度抽象:虽然易上手,但在处理复杂 JOIN 或聚合查询时非常痛苦。
  • 性能开销:由于需要将 JS 对象映射到 SQL,产生了大量的运行时开销。

2. 标志性事件

  • 2020 年:Prisma 2 发布,通过 Rust 编写的引擎统一了类型推导。
  • 2023 年:Drizzle ORM 爆红,主打「If you know SQL, you know Drizzle」。

二、 Prisma 的局限性:黑盒 Rust 二进制文件与冷启动

Prisma 是一个划时代的产品,但它也有难以逾越的障碍:

  1. 体积臃肿:Prisma 引擎是一个 30MB+ 的 Rust 二进制文件,这在 Serverless 场景下会导致严重的冷启动延迟。
  2. DSL 依赖:你需要学习 schema.prisma 这种专有语言。
  3. 类型推导复杂:虽然类型很强,但它是通过代码生成实现的,有时会产生数万行的类型定义文件。

三、 Drizzle ORM:不仅是 ORM,更是 SQL 的「类型安全层」

Drizzle 的哲学是:不发明新语言,直接用 TypeScript 写 SQL

核心特性

  1. 轻量级:核心库只有几百 KB,完全基于 JS/TS。
  2. 零运行时开销:它生成的 SQL 是极其高效的。
  3. 原生 SQL 语法:你写的代码和 SQL 逻辑几乎一一对应。
  4. 多运行时支持:Node.js、Bun、Deno、边缘运行时(Workers)全支持。

四、 快速上手:一键生成 Drizzle Schema 与迁移

代码示例:定义 Schema

import { pgTable, serial, text, varchar } from "drizzle-orm/pg-core";

export const users = pgTable('users', {
  id: serial('id').primaryKey(),
  fullName: text('full_name'),
  phone: varchar('phone', { length: 256 }),
});

数据库查询

import { db } from './db';
import { users } from './schema';

const allUsers = await db.select().from(users).where(eq(users.id, 1));

五、 核心优势:基于原生 SQL 的灵活性与复杂查询

Drizzle 允许你像写原生 SQL 一样进行 JOIN 操作:

await db.select()
  .from(users)
  .leftJoin(posts, eq(users.id, posts.authorId))
  .groupBy(users.id);

对比:Prisma 在处理复杂的 groupBy 或聚合查询时,往往需要使用 raw query,这会丢失类型安全。而 Drizzle 在复杂查询中依然保持完美的类型推导。


六、 实战 1:在 Cloudflare Workers 中使用 Drizzle 边缘查询

由于没有重量级的二进制引擎,Drizzle 是边缘运行时的绝佳搭档。

实现步骤

  1. 配置驱动:使用 drizzle-orm/d1drizzle-orm/planetscale-serverless
  2. 部署:由于代码是纯 JS,冷启动几乎为 0ms。

七、 总结:2024 年全栈项目的数据库技术栈选型建议

  • 如果你追求开发速度且不介意 Serverless 延迟:Prisma 依然是不错的选择。
  • 如果你追求极致性能、灵活的 SQL 查询以及边缘化部署:Drizzle ORM 是绝对的首选。