drizzle-kit generate

本指南假定您已熟悉:

drizzle-kit generate 允许你根据 Drizzle schema 在声明时或后续 schema 变更时生成 SQL migrations。

底层是如何工作的?

Drizzle Kit generate 命令会触发一系列事件:

  1. 它会读取你的 Drizzle schema 文件,并生成 schema 的 json 快照
  2. 它会读取之前的 migrations 文件夹,并将当前 json 快照与最近一次的快照进行比较
  3. 基于 json 差异生成 SQL migrations
  4. migration.sqlsnapshot.json 保存到当前时间戳下的 migration 文件夹中
src/schema.ts
import * as p from "drizzle-orm/cockroach-core";

export const users = p.cockroachTable("users", {
  id: p.int4().primaryKey(),
  name: p.string(),
  email: p.string().unique(), 
});
┌────────────────────────┐                  
│ $ drizzle-kit generate │                  
└─┬──────────────────────┘                  

  └ 1. 读取之前的 migration 文件夹
    2. 找出当前 schema 与之前 schema 的差异
    3. 如有必要,提示开发者确认重命名
  ┌ 4. 生成 SQL migration 并持久化到文件
  │    ┌─┴───────────────────────────────────────┐  
  │      📂 drizzle       
  │      └ 📂 20242409125510_premium_mister_fear
  │        ├ 📜 migration.sql
  │        └ 📜 snapshot.json
  v
-- drizzle/20242409125510_premium_mister_fear/migration.sql

CREATE TABLE "users" (
	"id" int4 PRIMARY KEY,
	"name" string,
	"email" string,
	CONSTRAINT "users_email_key" UNIQUE("email")
);

它的设计目的是覆盖管理 Drizzle migrations 的 代码优先 方案。
你可以使用 drizzle-kit migrate、Drizzle ORM 的 migrate()
bytebase 这样的外部 migration 工具,或者直接在数据库上自行运行 migrations 来应用生成的 migrations。

drizzle-kit generate 命令要求你同时提供 dialectschema 路径选项,
你可以通过 drizzle.config.ts 配置文件或 CLI 选项来设置它们

使用配置文件
作为 CLI 选项
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "cockroach",
  schema: "./src/schema.ts",
});
npx drizzle-kit generate

Schema 文件路径

你可以只有一个 schema.ts 文件,也可以在项目中分散放置任意多个 schema 文件。
Drizzle Kit 需要你通过 schema 配置选项,以 glob 的形式指定它们的路径。

Example 1
Example 2
Example 3
Example 4
📦 <project root>
 ├ ...
 ├ 📂 drizzle
 ├ 📂 src
 │ ├ ...
 │ ├ 📜 index.ts
 │ └ 📜 schema.ts 
 ├ 📜 drizzle.config.ts
 └ 📜 package.json
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  schema: "./src/schema.ts",
});

自定义 migration 文件名

你可以通过提供 --name CLI 选项来设置自定义 migration 文件名

npx drizzle-kit generate --name=init
📦 <project root>
 ├ 📂 drizzle
 │ └ 📂 20242409125510_init
 │   ├ 📜 snapshot.json
 │   └ 📜 migration.sql
 ├ 📂 src
 └ …

一个项目中的多个配置文件

你可以在项目中拥有多个 config 文件,当你有多个数据库阶段、多个数据库,或者同一项目中有不同数据库时,这非常有用:

npm
yarn
pnpm
bun
npx drizzle-kit generate --config=drizzle-dev.config.ts
npx drizzle-kit generate --config=drizzle-prod.config.ts
📦 <project root>
 ├ 📂 drizzle
 ├ 📂 src
 ├ 📜 .env
 ├ 📜 drizzle-dev.config.ts
 ├ 📜 drizzle-prod.config.ts
 ├ 📜 package.json
 └ 📜 tsconfig.json

自定义 migrations

你可以生成空的 migration 文件,用于编写你自己的自定义 SQL migrations,适用于目前 Drizzle Kit 不支持的 DDL 变更或数据填充。关于自定义 migrations 的扩展文档 - 看这里

drizzle-kit generate --custom --name=seed-users
📦 <project root>
 ├ 📂 drizzle
 │ ├ 📂 20242409125510_init
 │ └ 📂 20242409125510_seed-users
 ├ 📂 src
 └ …
-- ./drizzle/20242409125510_seed/migration.sql

INSERT INTO "users" ("name") VALUES('Dan');
INSERT INTO "users" ("name") VALUES('Andrew');
INSERT INTO "users" ("name") VALUES('Dandrew');

忽略冲突

如果你需要 generate 命令跳过交换律检查并绕过它,可以使用 --ignore-conflicts。如果你想使用它,说明
很有可能 drizzle-kit 没有正确检查 migrations,这通常是一个 bug。请把你的情况报告给我们,以便我们修复它。

drizzle-kit generate --ignore-conflicts

可用配置扩展列表

drizzle-kit generate 有一组仅限 cli 的选项

custom为自定义 migration 生成空 SQL
name生成带有自定义名称的 migration
ignore-conflicts跳过交换律冲突检查,默认值为 false
npm
yarn
pnpm
bun
npx drizzle-kit generate --name=init
npx drizzle-kit generate --name=seed_users --custom
npx drizzle-kit generate --ignore-conflicts



我们建议通过 drizzle.config.ts 文件来配置 drizzle-kit
不过在必要时你也可以通过 CLI 提供所有配置选项,例如在 CI/CD 流水线中等。

dialectrequired数据库方言,取 postgresql mysql sqlite turso singlestore mssql cockroach 之一
schemarequiredTypeScript schema 文件或包含多个 schema 文件的文件夹路径
outmigrations 输出文件夹,默认是 ./drizzle
config配置文件路径,默认是 drizzle.config.ts
breakpointsSQL 语句断点,默认是 true

扩展示例

下面是一个示例,展示如何创建一个名为 0001_seed-users.sql 的自定义 cockroach migration 文件,
Drizzle schema 位于 ./src/schema.ts,migrations 文件夹名为 ./migrations,而不是默认的 ./drizzle

我们还会把 drizzle 配置文件放在 configs 文件夹中。

让我们创建配置文件:

📦 <project root>
 ├ 📂 migrations
 ├ 📂 configs
 │ └ 📜 drizzle.config.ts
 ├ 📂 src
 └ …
drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "cockroach",
  schema: "./src/schema.ts",
  out: "./migrations",
});

现在运行

npx drizzle-kit generate --config=./configs/drizzle.config.ts --name=seed-users --custom

它将会成功生成

📦 <project root>
 ├ …
 ├ 📂 migrations
 │ ├ 📂 20242409125510_init
 │ └ 📂 20242409125510_seed-users
 └ …
-- ./drizzle/20242409125510_seed-users/migration.sql

INSERT INTO "users" ("name") VALUES('Dan');
INSERT INTO "users" ("name") VALUES('Andrew');
INSERT INTO "users" ("name") VALUES('Dandrew');