drizzle-kit migrate
本指南假定您已熟悉:
- 开始使用 Drizzle 和
drizzle-kit - 请阅读这里
- Drizzle schema 基础 - 请阅读这里
- 数据库连接基础 - 请阅读这里
- Drizzle migrations 基础 - 请阅读这里
- Drizzle Kit 概览 和 配置文件
drizzle-kit generate 命令 - 请阅读这里
drizzle-kit migrate 允许你应用由 drizzle-kit generate 生成的 SQL migrations。
它旨在覆盖管理 Drizzle migrations 的 code first(选项 3) 方法。
Drizzle Kit migrate 命令会触发一系列事件:
- 遍历 migration 文件夹并读取所有
.sql migration 文件
- 连接到数据库并从 drizzle migrations 日志表中获取条目
- 根据之前已应用的 migrations,决定要运行哪些新的 migrations
- 运行 SQL migrations,并将已应用的 migrations 记录到 drizzle migrations 表中
├ 📂 drizzle
│ ├ 📂 20242409125510_premium_mister_fear
│ └ 📂 20242409135510_delicate_professor_xavie
└ …
┌───────────────────────┐
│ $ drizzle-kit migrate │
└─┬─────────────────────┘
│ ┌──────────────────────────┐
└ 1. 读取 migrations 文件夹中的 migration.sql 文件 │ │
2. 从数据库获取 migration 历史记录 -------------> │ │
┌ 3. 选择之前尚未应用的 migrations <-------------- │ DATABASE │
└ 4. 将新的 migration 应用到数据库 ---------------> │ │
│ │
└──────────────────────────┘
[✓] 完成!
drizzle-kit migrate 命令要求你同时指定 dialect 和数据库连接凭据,
你可以通过 drizzle.config.ts 配置文件或通过 CLI 选项来提供它们
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "singlestore",
schema: "./src/schema.ts",
dbCredentials: {
url: "mysql://user:password@host:3306/dbname"
},
});
npx drizzle-kit migrate
npx drizzle-kit migrate --dialect=singlestore --url=mysql://user:password@host:3306/dbname
数据库中的已应用 migrations 日志
运行 migrations 时,Drizzle Kit 会将成功应用的 migrations 记录持久化到你的数据库中。
它会将这些记录存储在名为 __drizzle_migrations 的 migrations 日志表中。
你可以通过 drizzle 配置文件自定义该日志表的表名:
export default defineConfig({
dialect: "singlestore",
schema: "./src/schema.ts",
dbCredentials: {
url: "mysql://user:password@host:3306/dbname"
},
migrations: {
table: 'my-migrations-table', // 默认是 `__drizzle_migrations`
},
});
忽略冲突
IMPORTANT
--ignore-conflicts 从 drizzle-orm@1.0.0-beta.16 开始可用
如果你需要让 migrate 命令跳过幂等性检查并绕过它,可以使用 --ignore-conflicts。如果你想使用它,说明
很大概率是 drizzle-kit 没有正确检查 migrations,这可能是一个 bug。请把你的情况反馈给我们,以便我们修复它
drizzle-kit migrate --ignore-conflicts
一个项目中有多个配置文件
你可以在项目中拥有多个配置文件,这在你有多个数据库阶段或同一个项目中有多个数据库时非常有用:
npx drizzle-kit migrate --config=drizzle-dev.config.ts
npx drizzle-kit migrate --config=drizzle-prod.config.ts
yarn drizzle-kit migrate --config=drizzle-dev.config.ts
yarn drizzle-kit migrate --config=drizzle-prod.config.ts
pnpm drizzle-kit migrate --config=drizzle-dev.config.ts
pnpm drizzle-kit migrate --config=drizzle-prod.config.ts
bunx drizzle-kit migrate --config=drizzle-dev.config.ts
bunx drizzle-kit migrate --config=drizzle-prod.config.ts
📦 <project root>
├ 📂 drizzle
├ 📂 src
├ 📜 .env
├ 📜 drizzle-dev.config.ts
├ 📜 drizzle-prod.config.ts
├ 📜 package.json
└ 📜 tsconfig.json
扩展示例
让我们使用 drizzle-kit generate 和 drizzle-kit migrate 命令生成 SQL migration 并将其应用到数据库中
📦 <project root>
├ 📂 drizzle
├ 📂 src
│ ├ 📜 schema.ts
│ └ 📜 index.ts
├ 📜 drizzle.config.ts
└ …
drizzle.config.ts
src/schema.ts
import { defineConfig } from "drizzle-kit";
export default defineConfig({
dialect: "singlestore",
schema: "./src/schema.ts",
dbCredentials: {
url: "mysql://user:password@host:3306/dbname"
},
migrations: {
table: 'journal',
},
});
import * as p from "drizzle-orm/singlestore-core";
export const users = p.singlestoreTable("users", {
id: p.int().primaryKey().autoincrement(),
name: p.varchar({ length: 255 }),
})
现在让我们运行
npx drizzle-kit generate --name=init
它会生成
📦 <project root>
├ …
├ 📂 migrations
│ ├ 📂 20242409125510_init
└ …
-- ./drizzle/0000_init.sql
CREATE TABLE `users`(
`id` int auto_increment primary key,
`name` varchar(255)
)
现在让我们运行
npx drizzle-kit migrate
我们的 SQL migration 现在已经成功应用到数据库中了 ✅