drizzle-kit generate

This guide assumes familiarity with:

drizzle-kit generate 允许你在声明或后续模式更改时基于 Drizzle 模式生成 SQL 迁移。

How it works under the hood?

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

  1. 它将读取你的 Drizzle 模式文件并编写你的模式的 JSON 快照
  2. 它将读取你之前的迁移文件夹,并将当前 JSON 快照与最新的快照进行比较
  3. 根据 JSON 差异,生成 SQL 迁移
  4. migration.sqlsnapshot.json 保存在当前时间戳下的迁移文件夹中。
src/schema.ts
import * as p from "./drizzle-orm/pg-core";

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

  └ 1. read previous migration folders
    2. find diff between current and previous scheama
    3. prompt developer for renames if necessary
  ┌ 4. generate SQL migration and persist to file
  │    ┌─┴───────────────────────────────────────┐  
  │      📂 drizzle       
  │      ├ 📂 _meta
  │      └ 📜 0000_premium_mister_fear.sql
  v
-- drizzle/0000_premium_mister_fear.sql

CREATE TABLE "users" (
 "id" SERIAL PRIMARY KEY,
 "name" TEXT,
 "email" TEXT UNIQUE
);

它旨在涵盖管理 Drizzle 迁移的 代码优先 方法。你可以使用 drizzle-kit migrate、drizzle-orm 的 migrate()、外部迁移工具(如 bytebase)或直接在数据库上运行迁移来应用生成的迁移。

drizzle-kit generate 命令要求你提供 dialectschema 路径选项,你可以通过 drizzle.config.ts 配置文件或 CLI 选项进行设置。

With config file
As CLI options
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";

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

Schema 文件路径

你可以拥有一个 schema.ts 文件,也可以在整个项目中分布任意数量的模式文件。Drizzle Kit 要求你将这些模式文件的路径指定为 glob via schema 配置选项。

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",
});

自定义迁移文件名

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

npx drizzle-kit generate --name=init
📦 <project root>
 ├ 📂 drizzle
 │ ├ 📂 _meta
 │ └ 📜 0000_init.sql 
 ├ 📂 src
 └ …

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

项目中可以有多个配置文件,当同一个项目有多个数据库阶段或多个数据库或不同的数据库时,这非常有用:

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

自定义迁移

你可以生成空的迁移文件,以便为 Drizzle Kit 当前不支持的 DDL 替换或数据播种编写自定义 SQL 迁移。自定义迁移的扩展文档 - 参见此处

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

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

可用配置的扩展列表

drizzle-kit generate 包含一系列仅限命令行选项

custom为自定义迁移生成空 SQL
name生成自定义名称的迁移
npm
yarn
pnpm
bun
npx drizzle-kit 生成 --name=init drizzle-kit 生成 --name=seed_users --custom



我们建议通过 drizzle.config.ts 文件配置 drizzle-kit,但你也可以根据需要通过 CLI 提供所有配置选项,例如在 CI/CD 管道中等。

dialectrequired数据库方言,postgresql mysql sqlite turso singlestore 之一
schemarequiredTypeScript 模式文件或包含多个模式文件的文件夹的路径
out迁移输出文件夹,默认为 ./drizzle
config配置文件路径,默认为 drizzle.config.ts
breakpointsSQL 语句断点,默认值为 true

扩展示例

如何创建名为 0001_seed-users.sql 的自定义 Postgresql 迁移文件的示例,其中 Drizzle 模式位于 ./src/schema.ts 中,迁移文件夹名为 ./migrations,而不是默认的 ./drizzle

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

让我们创建配置文件:

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

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

现在运行

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

它将成功生成

📦 <project root>
 ├ …
 ├ 📂 migrations
 │ ├ 📂 _meta
 │ ├ 📜 0000_init.sql 
 │ └ 📜 0001_seed-users.sql 
 └ …
-- ./drizzle/0001_seed-users.sql

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