Drizzle ORM 入门:TypeScript 优先的数据库工具

Drizzle ORM 是 TypeScript 优先的现代 ORM,Schema 即类型、查询即 SQL。本文讲解 Schema 定义、增删改查、关系查询与迁移,以及与 Prisma 的取舍。

最佳实践
应用接口与数据存储连接插画

Drizzle 的哲学是"如果你会 SQL,你就会 Drizzle":用 TypeScript 代码定义表结构(类型自动推导),查询 API 与 SQL 一一对应,无隐式魔法、无引擎开销。它介于裸 SQL 和重型 ORM 之间,是目前 TS 生态类型安全与性能的最佳平衡点。

Drizzle 的定位

ORM 光谱的一端是 Prisma(自己的 Schema 语言、生成客户端、抽象一切),另一端是裸 SQL(全手动)。Drizzle 卡在中间甜点位:Schema 就是 TypeScript 代码,类型从此推导;查询写法贴近 SQL,执行什么语句一目了然,没有 N+1 惊喜。

安装与 Schema 定义

npm install drizzle-orm better-sqlite3
npm install -D drizzle-kit
// db/schema.ts
import { 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' }).$defaultFn(() => new Date()),
});

表结构即 TS 对象,User 类型通过 typeof users.$inferSelect 自动获得——改 Schema 类型跟着变,永不漂移。

连接与增删改查

import { drizzle } from 'drizzle-orm/better-sqlite3';
import { eq, like, desc } from 'drizzle-orm';
import { users } from './db/schema';

const db = drizzle('app.db');

// 增
await db.insert(users).values({ name: '观测云', email: 'a@b.com' });

// 查
const all = await db.select().from(users).orderBy(desc(users.createdAt));
const one = await db.select().from(users).where(eq(users.id, 1));
const found = await db.select().from(users).where(like(users.email, '%@b.com'));

// 改
await db.update(users).set({ name: '新名字' }).where(eq(users.id, 1));

// 删
await db.delete(users).where(eq(users.id, 1));

每个 API 调用都能心算出对应 SQL——调试时不用猜 ORM 生成了什么。

关系查询

// schema 中声明关系
export const usersRelations = relations(users, ({ many }) => ({
  posts: many(posts),
}));

// 查询时联表
const usersWithPosts = await db.query.users.findMany({
  with: { posts: true },
});

with 语法处理关联加载,行为明确(生成 JOIN 或分离查询可以控制),没有隐藏的懒加载。

迁移管理

drizzle-kit 从 Schema 生成 SQL 迁移:

npx drizzle-kit generate     # 对比 Schema 生成迁移 SQL
npx drizzle-kit migrate      # 应用迁移
npx drizzle-kit studio       # 打开可视化数据浏览器

迁移文件是纯 SQL,review 直接看语句——schema 漂移的恐慌不存在。

用实际查询验证数据访问方案

Drizzle ORM 入门的选择最终要落到查询次数、SQL 耗时与连接占用。应用接入观测云 APM 时,先核对 SDK 是否支持实际使用的数据库驱动,不能因为使用了某个 ORM 就假设全部查询自动可见。未覆盖的查询可手动插桩;PostgreSQL 等服务端数据库另配实例采集。SQL 和绑定参数上报前须脱敏,再按相同接口比较 N+1 查询与慢查询的变化。

接入文档:Node.js APM 接入 · PostgreSQL 采集 · 日志采集。

常见问题(FAQ)

Q:Drizzle 和 Prisma 怎么选?

会 SQL、重视类型推导与运行时性能选 Drizzle;团队 SQL 功底参差、想要"全托管"体验选 Prisma。详见本系列《Drizzle 和 Prisma 对比》。

Q:Drizzle 支持哪些数据库?

PostgreSQL、MySQL、SQLite 全系(含 Turso、Neon、PlanetScale 等 Serverless 变体),驱动适配层丰富,Serverless 环境可用 HTTP 驱动避免连接数问题。

Q:现有数据库能反向生成 Schema 吗?

能:drizzle-kit introspect 从现有库拉取表结构生成 TS Schema,存量项目接入无障碍。


参考文档

本文依据公开文档整理,示例需按项目依赖版本验证;不将文档中的性能描述视为本项目实测结果。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台