drizzle-orm
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDrizzle ORM
Drizzle ORM
~7.4kb minified+gzipped, zero dependencies, serverless-ready.
~7.4kb 压缩后大小,零依赖,支持无服务器环境。
Quick Start
快速开始
Install
安装
bash
undefinedbash
undefinedPostgreSQL
PostgreSQL
npm i drizzle-orm pg
npm i -D drizzle-kit @types/pg
npm i drizzle-orm pg
npm i -D drizzle-kit @types/pg
MySQL
MySQL
npm i drizzle-orm mysql2
npm i -D drizzle-kit
npm i drizzle-orm mysql2
npm i -D drizzle-kit
SQLite
SQLite
npm i drizzle-orm better-sqlite3
npm i -D drizzle-kit @types/better-sqlite3
npm i drizzle-orm better-sqlite3
npm i -D drizzle-kit @types/better-sqlite3
Turso / LibSQL
Turso / LibSQL
npm i drizzle-orm @libsql/client
npm i -D drizzle-kit
npm i drizzle-orm @libsql/client
npm i -D drizzle-kit
Bun SQL (PostgreSQL — zero extra deps)
Bun SQL (PostgreSQL — 无需额外依赖)
bun add drizzle-orm
bun add -D drizzle-kit
bun add drizzle-orm
bun add -D drizzle-kit
Bun SQLite (zero extra deps, sync APIs)
Bun SQLite (无需额外依赖,同步API)
bun add drizzle-orm
bun add -D drizzle-kit
undefinedbun add drizzle-orm
bun add -D drizzle-kit
undefinedConfig
配置
ts
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql", // "postgresql" | "mysql" | "sqlite" | "turso" | "singlestore"
schema: "./src/db/schema.ts",
out: "./drizzle",
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});ts
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "postgresql", // "postgresql" | "mysql" | "sqlite" | "turso" | "singlestore"
schema: "./src/db/schema.ts",
out: "./drizzle",
dbCredentials: {
url: process.env.DATABASE_URL!,
},
});Schema
Schema定义
ts
// src/db/schema.ts
import { pgTable, serial, text, integer, timestamp } from "drizzle-orm/pg-core";
export const users = pgTable("users", {
id: serial().primaryKey(),
name: text().notNull(),
email: text().unique(),
createdAt: timestamp().defaultNow(),
});
export const posts = pgTable("posts", {
id: serial().primaryKey(),
title: text().notNull(),
content: text(),
authorId: integer("author_id").references(() => users.id),
});ts
// src/db/schema.ts
import { pgTable, serial, text, integer, timestamp } from "drizzle-orm/pg-core";
export const users = pgTable("users", {
id: serial().primaryKey(),
name: text().notNull(),
email: text().unique(),
createdAt: timestamp().defaultNow(),
});
export const posts = pgTable("posts", {
id: serial().primaryKey(),
title: text().notNull(),
content: text(),
authorId: integer("author_id").references(() => users.id),
});Connect & Query
连接与查询
ts
import { drizzle } from "drizzle-orm/node-postgres";
import { eq } from "drizzle-orm";
import * as schema from "./schema";
const db = drizzle(process.env.DATABASE_URL!, { schema });
// select
const allUsers = await db.select().from(schema.users);
// insert
const [user] = await db.insert(schema.users)
.values({ name: "Dan", email: "dan@example.com" })
.returning();
// update
await db.update(schema.users)
.set({ name: "Daniel" })
.where(eq(schema.users.id, 1));
// delete
await db.delete(schema.users).where(eq(schema.users.id, 1));See references/connections.md for all provider setups (Neon, Turso, Supabase, D1, etc.).
ts
import { drizzle } from "drizzle-orm/node-postgres";
import { eq } from "drizzle-orm";
import * as schema from "./schema";
const db = drizzle(process.env.DATABASE_URL!, { schema });
// 查询
const allUsers = await db.select().from(schema.users);
// 插入
const [user] = await db.insert(schema.users)
.values({ name: "Dan", email: "dan@example.com" })
.returning();
// 更新
await db.update(schema.users)
.set({ name: "Daniel" })
.where(eq(schema.users.id, 1));
// 删除
await db.delete(schema.users).where(eq(schema.users.id, 1));查看 references/connections.md 获取所有服务商的配置教程(Neon、Turso、Supabase、D1等)。
Schema Declaration
Schema声明
Import table/column builders from the dialect-specific module:
ts
// PG: import { pgTable, serial, text, ... } from "drizzle-orm/pg-core";
// MySQL: import { mysqlTable, int, varchar, ... } from "drizzle-orm/mysql-core";
// SQLite: import { sqliteTable, integer, text, ... } from "drizzle-orm/sqlite-core";从对应数据库方言的模块中导入表/列构建器:
ts
// PG: import { pgTable, serial, text, ... } from "drizzle-orm/pg-core";
// MySQL: import { mysqlTable, int, varchar, ... } from "drizzle-orm/mysql-core";
// SQLite: import { sqliteTable, integer, text, ... } from "drizzle-orm/sqlite-core";Common Column Types (PG)
常见列类型(PG)
| Type | Usage | Notes |
|---|---|---|
| Auto-increment PK | Use |
| 4-byte int | |
| 8-byte int | |
| Unlimited text | |
| Variable-length | |
| true/false | |
| Date/time | |
| Calendar date | |
| JSON data | |
| UUID | |
| Exact decimal | Returns string by default |
| 类型 | 使用方式 | 说明 |
|---|---|---|
| 自增主键 | 新项目建议使用 |
| 4字节整数 | |
| 8字节整数 | 数值超过2^53时使用 |
| 无限长度文本 | 通过 |
| 可变长度字符串 | |
| 布尔值 | |
| 日期时间 | 支持 |
| 日历日期 | |
| JSON数据 | 通过 |
| UUID | |
| 精确小数 | 默认返回字符串类型 |
Constraint Modifiers
约束修饰符
ts
column.notNull()
column.default(value)
column.default(sql`now()`)
column.$defaultFn(() => createId()) // runtime default
column.$onUpdate(() => new Date()) // runtime on update
column.primaryKey()
column.unique()
column.references(() => other.id, { onDelete: "cascade" })
column.$type<CustomType>() // branded typests
column.notNull()
column.default(value)
column.default(sql`now()`)
column.$defaultFn(() => createId()) // 运行时默认值
column.$onUpdate(() => new Date()) // 运行时更新值
column.primaryKey()
column.unique()
column.references(() => other.id, { onDelete: "cascade" })
column.$type<CustomType>() // 自定义品牌类型Auto-map Casing
自动映射大小写
ts
// drizzle.config.ts
export default defineConfig({
casing: "snake_case", // camelCase TS keys -> snake_case DB columns
});Full column type catalogs: PG | MySQL | SQLite | MSSQL/CockroachDB/SingleStore
ts
// drizzle.config.ts
export default defineConfig({
casing: "snake_case", // 将TS中的驼峰键映射为数据库中的蛇形列名
});完整列类型参考:PG | MySQL | SQLite | MSSQL/CockroachDB/SingleStore
CRUD Operations
CRUD操作
All operators imported from :
"drizzle-orm"ts
import { eq, ne, gt, gte, lt, lte, and, or, not, like, ilike, inArray, between, isNull, sql } from "drizzle-orm";所有操作符从导入:
"drizzle-orm"ts
import { eq, ne, gt, gte, lt, lte, and, or, not, like, ilike, inArray, between, isNull, sql } from "drizzle-orm";Select
查询
ts
// basic
await db.select().from(users);
// partial + where
await db.select({ id: users.id, name: users.name })
.from(users)
.where(and(eq(users.role, "admin"), gt(users.age, 18)))
.orderBy(asc(users.name))
.limit(10).offset(20);
// aggregation
await db.select({ role: users.role, count: sql<number>`count(*)` })
.from(users).groupBy(users.role).having(gt(sql`count(*)`, 5));ts
// 基础查询
await db.select().from(users);
// 部分字段 + 条件
await db.select({ id: users.id, name: users.name })
.from(users)
.where(and(eq(users.role, "admin"), gt(users.age, 18)))
.orderBy(asc(users.name))
.limit(10).offset(20);
// 聚合查询
await db.select({ role: users.role, count: sql<number>`count(*)` })
.from(users).groupBy(users.role).having(gt(sql`count(*)`, 5));Insert
插入
ts
// single + returning
const [user] = await db.insert(users).values({ name: "Dan" }).returning();
// bulk
await db.insert(users).values([{ name: "A" }, { name: "B" }]);
// upsert (PG/SQLite)
await db.insert(users).values({ id: 1, name: "Dan" })
.onConflictDoUpdate({ target: users.id, set: { name: "Dan" } });
// upsert (MySQL)
await db.insert(users).values({ id: 1, name: "Dan" })
.onDuplicateKeyUpdate({ set: { name: "Dan" } });ts
// 单条插入 + 返回结果
const [user] = await db.insert(users).values({ name: "Dan" }).returning();
// 批量插入
await db.insert(users).values([{ name: "A" }, { name: "B" }]);
// 插入或更新(PG/SQLite)
await db.insert(users).values({ id: 1, name: "Dan" })
.onConflictDoUpdate({ target: users.id, set: { name: "Dan" } });
// 插入或更新(MySQL)
await db.insert(users).values({ id: 1, name: "Dan" })
.onDuplicateKeyUpdate({ set: { name: "Dan" } });Update / Delete
更新 / 删除
ts
await db.update(users).set({ name: "Jane" }).where(eq(users.id, 1)).returning();
await db.delete(users).where(eq(users.id, 1)).returning();Full queries reference: references/queries.md
ts
await db.update(users).set({ name: "Jane" }).where(eq(users.id, 1)).returning();
await db.delete(users).where(eq(users.id, 1)).returning();完整查询参考:references/queries.md
Joins
关联查询
ts
// inner join
await db.select().from(users)
.innerJoin(posts, eq(users.id, posts.authorId));
// left join
await db.select().from(users)
.leftJoin(orders, eq(users.id, orders.userId));
// self-join with alias
import { alias } from "drizzle-orm/pg-core";
const parent = alias(users, "parent");
await db.select().from(users).leftJoin(parent, eq(users.managerId, parent.id));ts
// 内连接
await db.select().from(users)
.innerJoin(posts, eq(users.id, posts.authorId));
// 左连接
await db.select().from(users)
.leftJoin(orders, eq(users.id, orders.userId));
// 自连接(使用别名)
import { alias } from "drizzle-orm/pg-core";
const parent = alias(users, "parent");
await db.select().from(users).leftJoin(parent, eq(users.managerId, parent.id));Relations
关系定义
V1 (Stable)
V1(稳定版)
ts
import { relations } from "drizzle-orm";
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}));
export const postsRelations = relations(posts, ({ one }) => ({
author: one(users, { fields: [posts.authorId], references: [users.id] }),
}));ts
import { relations } from "drizzle-orm";
export const usersRelations = relations(users, ({ many }) => ({
posts: many(posts),
}));
export const postsRelations = relations(posts, ({ one }) => ({
author: one(users, { fields: [posts.authorId], references: [users.id] }),
}));Relational Queries
关系查询
Pass to drizzle to enable :
schemadb.queryts
const db = drizzle(url, { schema });
const result = await db.query.users.findMany({
columns: { id: true, name: true },
with: { posts: { with: { comments: true } } },
where: (users, { eq }) => eq(users.id, 1),
orderBy: (users, { desc }) => desc(users.createdAt),
limit: 10,
});
const user = await db.query.users.findFirst({
where: (users, { eq }) => eq(users.name, "Dan"),
with: { posts: true },
});在初始化drizzle时传入以启用:
schemadb.queryts
const db = drizzle(url, { schema });
const result = await db.query.users.findMany({
columns: { id: true, name: true },
with: { posts: { with: { comments: true } } },
where: (users, { eq }) => eq(users.id, 1),
orderBy: (users, { desc }) => desc(users.createdAt),
limit: 10,
});
const user = await db.query.users.findFirst({
where: (users, { eq }) => eq(users.name, "Dan"),
with: { posts: true },
});V2 (Beta)
V2(测试版)
ts
import { defineRelations } from "drizzle-orm";
export const relations = defineRelations(schema, (r) => ({
users: { posts: r.many.posts() },
posts: { author: r.one.users({ from: r.posts.authorId, to: r.users.id }) },
}));V2 adds for many-to-many without junction table boilerplate.
.through()Full relations reference: references/relations.md
ts
import { defineRelations } from "drizzle-orm";
export const relations = defineRelations(schema, (r) => ({
users: { posts: r.many.posts() },
posts: { author: r.one.users({ from: r.posts.authorId, to: r.users.id }) },
}));V2新增方法,无需中间表即可处理多对多关系。
.through()完整关系参考:references/relations.md
Drizzle Kit
Drizzle Kit
| Command | Description |
|---|---|
| Create SQL migration files from schema diff |
| Apply pending migrations |
| Sync schema directly (prototyping only) |
| Introspect DB → Drizzle schema |
| Validate migration consistency |
| Visual database browser |
Full migrations reference: references/migrations.md
| 命令 | 描述 |
|---|---|
| 根据Schema差异生成SQL迁移文件 |
| 应用待处理的迁移 |
| 直接同步Schema(仅用于原型开发) |
| 反向生成Schema(从数据库到Drizzle Schema) |
| 验证迁移一致性 |
| 可视化数据库浏览器 |
完整迁移参考:references/migrations.md
Transactions
事务
ts
const result = await db.transaction(async (tx) => {
const [user] = await tx.insert(users).values({ name: "Dan" }).returning();
await tx.insert(accounts).values({ userId: user.id, balance: 0 });
return user;
});Rollback with . Nested transactions create savepoints.
tx.rollback()Full reference: references/transactions-and-batch.md
ts
const result = await db.transaction(async (tx) => {
const [user] = await tx.insert(users).values({ name: "Dan" }).returning();
await tx.insert(accounts).values({ userId: user.id, balance: 0 });
return user;
});调用回滚事务。嵌套事务会创建保存点。
tx.rollback()完整参考:references/transactions-and-batch.md
Raw SQL
原生SQL
ts
import { sql } from "drizzle-orm";
// typed expression
const lower = sql<string>`lower(${users.name})`;
// full raw query
await db.execute(sql`SELECT * FROM ${users} WHERE ${users.id} = ${id}`);
// placeholder for prepared statements
const prepared = db.select().from(users)
.where(eq(users.id, sql.placeholder("id")))
.prepare("get_user");
await prepared.execute({ id: 1 });ts
import { sql } from "drizzle-orm";
// 类型化表达式
const lower = sql<string>`lower(${users.name})`;
// 完整原生查询
await db.execute(sql`SELECT * FROM ${users} WHERE ${users.id} = ${id}`);
// 预编译语句占位符
const prepared = db.select().from(users)
.where(eq(users.id, sql.placeholder("id")))
.prepare("get_user");
await prepared.execute({ id: 1 });Reference Index
参考索引
| Topic | File |
|---|---|
| PostgreSQL column types, enums, schemas, indexes, views, RLS | references/schema-postgresql.md |
| MySQL column types, enums, indexes, views | references/schema-mysql.md |
| SQLite column types, indexes, views | references/schema-sqlite.md |
| MSSQL, CockroachDB, SingleStore types | references/column-types-minor-dialects.md |
| Full query operators, advanced select, joins, CTEs, set ops, $count | references/queries.md |
| Relations v1 + v2, relational queries API | references/relations.md |
| Drizzle Kit config, commands, programmatic migration | references/migrations.md |
| Transactions, savepoints, batch API | references/transactions-and-batch.md |
| drizzle-zod, drizzle-valibot, drizzle-typebox, etc. | references/schema-validation.md |
| Connection setup per provider (Neon, Turso, Supabase, D1, PGlite, Expo, etc.) | references/connections.md |
| Database seeding with drizzle-seed, versioning | references/drizzle-seed.md |
| Read replicas, custom types, caching, ESLint, gotchas, drizzle-graphql | references/advanced-patterns.md |
| 主题 | 文档 |
|---|---|
| PostgreSQL列类型、枚举、Schema、索引、视图、RLS | references/schema-postgresql.md |
| MySQL列类型、枚举、索引、视图 | references/schema-mysql.md |
| SQLite列类型、索引、视图 | references/schema-sqlite.md |
| MSSQL、CockroachDB、SingleStore类型 | references/column-types-minor-dialects.md |
| 完整查询操作符、高级查询、连接、CTE、集合操作、$count | references/queries.md |
| 关系V1+V2、关系查询API | references/relations.md |
| Drizzle Kit配置、命令、程序化迁移 | references/migrations.md |
| 事务、保存点、批量API | references/transactions-and-batch.md |
| drizzle-zod、drizzle-valibot、drizzle-typebox等 | references/schema-validation.md |
| 各服务商连接配置(Neon、Turso、Supabase、D1、PGlite、Expo等) | references/connections.md |
| 使用drizzle-seed进行数据库种子数据填充、版本控制 | references/drizzle-seed.md |
| 只读副本、自定义类型、缓存、ESLint、常见问题、drizzle-graphql | references/advanced-patterns.md |