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 保存到 migrations 文件夹中
import * as p from "drizzle-orm/mysql-core" ;
export const users = p .mysqlTable ( "users" , {
id : p .int () .primaryKey () .autoincrement () ,
name : p .varchar ({ length : 255 }) ,
email : p .varchar ({ length : 255 }) .unique () ,
});
┌────────────────────────┐
│ $ drizzle-kit generate │
└─┬──────────────────────┘
│
└ 1. read previous migration folders
2. find diff between current and previous schema
3. prompt developer for renames if necessary
┌ 4. generate SQL migration and persist to file
│ ┌─┴───────────────────────────────────────┐
│ 📂 drizzle
│ └ 📂 20242409125510_premium_mister_fear
│ ├ 📜 migration.sql
│ └ 📜 snapshot.json
v -- drizzle/20242409125510_premium_mister_fear/migration.sql
CREATE TABLE ` users ` (
`id` int AUTO_INCREMENT PRIMARY KEY ,
`name` varchar ( 255 ),
`email` varchar ( 255 ),
CONSTRAINT `email_unique` UNIQUE INDEX ( `email` )
);
它旨在覆盖管理 Drizzle migrations 的 代码优先 方式。
你可以使用 drizzle-kit migrate 应用生成的 migrations,使用 drizzle-orm 的 migrate(),
也可以使用 bytebase 等外部迁移工具,或者直接在数据库上自行运行 migrations。
drizzle-kit generate 命令要求你同时提供 dialect 和 schema 路径选项,
你可以通过 drizzle.config.ts 配置文件或 CLI 选项来设置它们
With config file
As CLI options
// drizzle.config.ts
import { defineConfig } from "drizzle-kit" ;
export default defineConfig ({
dialect : "mysql" ,
schema : "./src/schema.ts" ,
}); npx drizzle-kit generate npx drizzle-kit generate --dialect=mysql --schema=./src/schema.ts
Schema files path
你可以只有一个 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
});
Custom migration file name
你可以通过提供 --name CLI 选项来设置自定义 migration 文件名
npx drizzle-kit generate --name=init
📦 <project root>
├ 📂 drizzle
│ └ 📂 20242409125510_init
│ ├ 📜 snapshot.json
│ └ 📜 migration.sql
├ 📂 src
└ …
Multiple configuration files in one project
你可以在一个项目中拥有多个配置文件,这在你有多个数据库阶段、多个数据库,或者同一个项目中使用不同数据库时非常有用:
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
Custom 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-users/migration.sql
INSERT INTO `users` ( `name` ) VALUES ( 'Dan' );
INSERT INTO `users` ( `name` ) VALUES ( 'Andrew' );
INSERT INTO `users` ( `name` ) VALUES ( 'Dandrew' );
Ignore conflicts
如果你需要让 generate 命令跳过可交换性检查并绕过它,可以使用 --ignore-conflicts。如果你想使用它,
那很有可能是 drizzle-kit 的 migrations 检查不正确,这属于一个 bug。请把你的情况报告给我们,以便我们修复它
drizzle-kit generate --ignore-conflicts
Extended list of available configurations
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
Extended example
示例:如何创建一个名为 0001_seed-users.sql 的自定义 MySQL 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 : "mysql" ,
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' );