drizzle-kit migrate

本指南假定您已熟悉:

drizzle-kit migrate 允许你应用由 drizzle-kit generate 生成的 SQL migrations。 它旨在覆盖管理 Drizzle migrations 的 code first(选项 3) 方法。

底层是如何工作的?

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

  1. 遍历 migration 文件夹并读取所有 .sql migration 文件
  2. 连接到数据库并从 drizzle migrations 日志表中获取条目
  3. 根据之前已应用的 migrations,决定要运行哪些新的 migrations
  4. 运行 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 选项来提供它们

使用配置文件
作为 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

数据库中的已应用 migrations 日志

运行 migrations 时,Drizzle Kit 会将成功应用的 migrations 记录持久化到你的数据库中。 它会将这些记录存储在名为 __drizzle_migrations 的 migrations 日志表中。

你可以通过 drizzle 配置文件自定义该日志表的名:

drizzle.config.ts
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-conflictsdrizzle-orm@1.0.0-beta.16 开始可用

如果你需要让 migrate 命令跳过幂等性检查并绕过它,可以使用 --ignore-conflicts。如果你想使用它,说明 很大概率是 drizzle-kit 没有正确检查 migrations,这可能是一个 bug。请把你的情况反馈给我们,以便我们修复它

drizzle-kit migrate --ignore-conflicts

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

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

npm
yarn
pnpm
bun
npx drizzle-kit migrate --config=drizzle-dev.config.ts
npx 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 generatedrizzle-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', 
  },
});

现在让我们运行

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 现在已经成功应用到数据库中了 ✅