drizzle-kit generate
本指南假定您已熟悉:
开始使用 Drizzle 和 drizzle-kit - 在此阅读
Drizzle schema 基础 - 在此阅读
数据库连接基础 - 在此阅读
Drizzle migrations 基础 - 在此阅读
Drizzle Kit 概览 和 配置文件
drizzle-kit generate 允许你根据 Drizzle schema 在声明时或后续 schema 变更时生成 SQL migrations。
Drizzle Kit generate 命令会触发一系列事件:
它会读取你的 Drizzle schema 文件,并生成 schema 的 json 快照
它会读取之前的 migrations 文件夹,并将当前 json 快照与最近一次的快照进行比较
基于 json 差异生成 SQL migrations
将 migration.sql 和 snapshot.json 保存到当前时间戳下的 migration 文件夹中
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 命令要求你同时提供 dialect 和 schema 路径选项,
你可以通过 drizzle.config.ts 配置文件或 CLI 选项来设置它们
// drizzle.config.ts
import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
dialect : "cockroach" ,
schema : "./src/schema.ts" ,
}); npx drizzle-kit generate npx drizzle-kit generate --dialect=cockroach --schema=./src/schema.ts
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" ,
}); 📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
│ ├ 📂 user
│ │ ├ 📜 handler.ts
│ │ └ 📜 schema.ts
│ ├ 📂 posts
│ │ ├ 📜 handler.ts
│ │ └ 📜 schema.ts
│ └ 📜 index.ts
├ 📜 drizzle.config.ts
└ 📜 package.json import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
schema : "./src/**/schema.ts" ,
//or
schema : [ "./src/user/schema.ts" , "./src/posts/schema.ts" ]
}); 📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
│ ├ 📂 schema
│ │ ├ 📜 user.ts
│ │ ├ 📜 post.ts
│ │ └ 📜 comment.ts
│ └ 📜 index.ts
├ 📜 drizzle.config.ts
└ 📜 package.json import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
schema : "./src/schema/*" ,
}); 📦 <project root>
├ ...
├ 📂 drizzle
├ 📂 src
│ ├ 📜 userById.ts
│ ├ 📜 userByEmail.ts
│ ├ 📜 listUsers.ts
│ ├ 📜 user.sql.ts
│ ├ 📜 postById.ts
│ ├ 📜 listPosts.ts
│ └ 📜 post.sql.ts
│ 📜 index.ts
├ 📜 drizzle.config.ts
└ 📜 package.json import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
schema : "./src/**/*.sql.ts" , // Dax's favourite
});
自定义 migration 文件名
你可以通过提供 --name CLI 选项来设置自定义 migration 文件名
npx drizzle-kit generate --name=init
📦 <project root>
├ 📂 drizzle
│ └ 📂 20242409125510_init
│ ├ 📜 snapshot.json
│ └ 📜 migration.sql
├ 📂 src
└ …
一个项目中的多个配置文件
你可以在项目中拥有多个 config 文件,当你有多个数据库阶段、多个数据库,或者同一项目中有不同数据库时,这非常有用:
npx drizzle-kit generate --config=drizzle-dev.config.ts
npx drizzle-kit generate --config=drizzle-prod.config.ts
yarn drizzle-kit generate --config=drizzle-dev.config.ts
yarn drizzle-kit generate --config=drizzle-prod.config.ts
pnpm drizzle-kit generate --config=drizzle-dev.config.ts
pnpm drizzle-kit generate --config=drizzle-prod.config.ts
bunx drizzle-kit generate --config=drizzle-dev.config.ts
bunx 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
npx drizzle-kit generate --name=init
npx drizzle-kit generate --name=seed_users --custom
npx drizzle-kit generate --ignore-conflicts
yarn drizzle-kit generate --name=init
yarn drizzle-kit generate --name=seed_users --custom
yarn drizzle-kit generate --ignore-conflicts
pnpm drizzle-kit generate --name=init
pnpm drizzle-kit generate --name=seed_users --custom
pnpm drizzle-kit generate --ignore-conflicts
bunx drizzle-kit generate --name=init
bunx drizzle-kit generate --name=seed_users --custom
bunx 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
└ …
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' );