Drizzle ORM
类型安全 SQL;对照 TypeORM。
35 分钟
Drizzle ORM
Drizzle 走 SQL-first、TypeScript 原生 路线:表结构即类型来源,查询写法接近 SQL,却全程有补全与编译期检查。与 Nest 常用的 TypeORM 相比,更轻、更透明。
学习目标
- 定义 schema 并连接 PostgreSQL
- 写 select / insert / where 与关系查询
- 对照 TypeORM:何时选 Drizzle
Schema 与连接
import { pgTable, serial, varchar, timestamp } from "drizzle-orm/pg-core";
import { drizzle } from "drizzle-orm/node-postgres";
import pg from "pg";
export const tracks = pgTable("tracks", {
id: serial("id").primaryKey(),
slug: varchar("slug", { length: 64 }).notNull().unique(),
title: varchar("title", { length: 255 }).notNull(),
createdAt: timestamp("created_at").defaultNow(),
});
const pool = new pg.Pool({ connectionString: process.env.DATABASE_URL });
export const db = drizzle(pool);
表定义即 TS 类型;改列名会直接在编译期报错。
查询示例
import { eq } from "drizzle-orm";
const list = await db.select().from(tracks).limit(20);
const one = await db
.select()
.from(tracks)
.where(eq(tracks.slug, "nodejs-essentials"));
await db.insert(tracks).values({ slug: "demo", title: "Demo Track" });
无魔法 Active Record;SQL 意图清晰,便于 DBA 审查。
Drizzle vs TypeORM(Nest 默认)
| Drizzle | TypeORM | |
|---|---|---|
| 风格 | SQL-like builder | 装饰器 Entity |
| 迁移 | drizzle-kit | typeorm migration |
| 学习曲线 | 会 SQL 即上手 | 概念多(Repository 等) |
| 典型搭配 | Fastify/Hono 小服务 | nestjs-essentials |
数据库建模与索引见 postgresql-essentials;TS 泛型与类型收窄见 typescript-essentials。
练习
- 为
tracks表写 drizzle-kit 迁移(本地 Postgres) - 实现
GET /api/tracks/:slug查库返回 404/200 - 对比同一查询用 raw SQL 与 Drizzle 的可读性