drizzle-orm

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Drizzle ORM

Drizzle ORM

~7.4kb minified+gzipped, zero dependencies, serverless-ready.
~7.4kb 压缩后大小,零依赖,支持无服务器环境。

Quick Start

快速开始

Install

安装

bash
undefined
bash
undefined

PostgreSQL

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
undefined
bun add drizzle-orm bun add -D drizzle-kit
undefined

Config

配置

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)

TypeUsageNotes
serial()
Auto-increment PKUse
integer().generatedAlwaysAsIdentity()
for new projects
integer()
4-byte int
bigint({ mode: "number" })
8-byte int
"bigint"
mode for >2^53
text()
Unlimited text
{ enum: [...] }
for TS union
varchar({ length: n })
Variable-length
boolean()
true/false
timestamp()
Date/time
{ withTimezone: true }
,
mode: "date"
date()
Calendar date
mode: "date"
for JS Date
json()
/
jsonb()
JSON data
.$type<T>()
for typing
uuid()
UUID
.defaultRandom()
for gen_random_uuid()
numeric({ precision, scale })
Exact decimalReturns string by default
类型使用方式说明
serial()
自增主键新项目建议使用
integer().generatedAlwaysAsIdentity()
integer()
4字节整数
bigint({ mode: "number" })
8字节整数数值超过2^53时使用
"bigint"
模式
text()
无限长度文本通过
{ enum: [...] }
定义TS联合类型
varchar({ length: n })
可变长度字符串
boolean()
布尔值
timestamp()
日期时间支持
{ withTimezone: true }
mode: "date"
date()
日历日期
mode: "date"
返回JS Date类型
json()
/
jsonb()
JSON数据通过
.$type<T>()
定义类型
uuid()
UUID
.defaultRandom()
调用gen_random_uuid()生成
numeric({ precision, scale })
精确小数默认返回字符串类型

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 types
ts
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
schema
to drizzle to enable
db.query
:
ts
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时传入
schema
以启用
db.query
ts
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
.through()
for many-to-many without junction table boilerplate.
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

CommandDescription
npx drizzle-kit generate
Create SQL migration files from schema diff
npx drizzle-kit migrate
Apply pending migrations
npx drizzle-kit push
Sync schema directly (prototyping only)
npx drizzle-kit pull
Introspect DB → Drizzle schema
npx drizzle-kit check
Validate migration consistency
npx drizzle-kit studio
Visual database browser
Full migrations reference: references/migrations.md
命令描述
npx drizzle-kit generate
根据Schema差异生成SQL迁移文件
npx drizzle-kit migrate
应用待处理的迁移
npx drizzle-kit push
直接同步Schema(仅用于原型开发)
npx drizzle-kit pull
反向生成Schema(从数据库到Drizzle Schema)
npx drizzle-kit check
验证迁移一致性
npx drizzle-kit studio
可视化数据库浏览器
完整迁移参考: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
tx.rollback()
. Nested transactions create savepoints.
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

参考索引

TopicFile
PostgreSQL column types, enums, schemas, indexes, views, RLSreferences/schema-postgresql.md
MySQL column types, enums, indexes, viewsreferences/schema-mysql.md
SQLite column types, indexes, viewsreferences/schema-sqlite.md
MSSQL, CockroachDB, SingleStore typesreferences/column-types-minor-dialects.md
Full query operators, advanced select, joins, CTEs, set ops, $countreferences/queries.md
Relations v1 + v2, relational queries APIreferences/relations.md
Drizzle Kit config, commands, programmatic migrationreferences/migrations.md
Transactions, savepoints, batch APIreferences/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, versioningreferences/drizzle-seed.md
Read replicas, custom types, caching, ESLint, gotchas, drizzle-graphqlreferences/advanced-patterns.md
主题文档
PostgreSQL列类型、枚举、Schema、索引、视图、RLSreferences/schema-postgresql.md
MySQL列类型、枚举、索引、视图references/schema-mysql.md
SQLite列类型、索引、视图references/schema-sqlite.md
MSSQL、CockroachDB、SingleStore类型references/column-types-minor-dialects.md
完整查询操作符、高级查询、连接、CTE、集合操作、$countreferences/queries.md
关系V1+V2、关系查询APIreferences/relations.md
Drizzle Kit配置、命令、程序化迁移references/migrations.md
事务、保存点、批量APIreferences/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-graphqlreferences/advanced-patterns.md