drizzle-kit migrate

本指南假定您熟悉

drizzle-kit migrate 允许您应用由 drizzle-kit generate 生成的 SQL 迁移。它旨在涵盖管理 Drizzle 迁移的代码优先(选项 3)方法。

底层原理是什么?

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

  1. 读取迁移文件夹并读取所有 .sql 迁移文件
  2. 连接到数据库并从 drizzle 迁移日志表中获取条目
  3. 根据以前应用的迁移,它将决定要运行哪些新迁移
  4. 运行 SQL 迁移并将应用的迁移记录到 drizzle 迁移表中
  ├ 📂 drizzle       
  │ ├ 📂 _meta
  │ ├ 📜 0000_premium_mister_fear.sql
  │ └ 📜 0001_delicate_professor_xavie.sql
  └ …
┌───────────────────────┐                  
│ $ drizzle-kit migrate │                  
└─┬─────────────────────┘                  
  │                                                         ┌──────────────────────────┐                                         
  └ 1. reads migration.sql files in migrations folder       │                          │
    2. fetch migration history from database -------------> │                          │
  ┌ 3. pick previously unapplied migrations <-------------- │         DATABASE         │
  └ 4. apply new migration to the database ---------------> │                          │
                                                            │                          │
                                                            └──────────────────────────┘
[✓] done!        

drizzle-kit migrate 命令要求您指定 dialect 和数据库连接凭据,您可以通过 drizzle.config.ts 配置文件或通过 CLI 选项提供它们

使用配置文件
作为 CLI 选项
// drizzle.config.ts
import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "postgresql",
  schema: "./src/schema.ts",
  dbCredentials: {
    url: "postgresql://user:password@host:port/dbname"
  },
});
npx drizzle-kit migrate

数据库中已应用的迁移日志

运行迁移后,Drizzle Kit 会将成功应用的迁移记录持久化到您的数据库中。它将把它们存储在名为 __drizzle_migrations 的迁移日志表中。

您可以通过 drizzle 配置文件自定义该表的**表名**和**模式**(仅限 PostgreSQL)

drizzle.config.ts
export default defineConfig({
  dialect: "postgresql",
  schema: "./src/schema.ts",
  dbCredentials: {
    url: "postgresql://user:password@host:port/dbname"
  },
  migrations: {
    table: 'my-migrations-table', // `__drizzle_migrations` by default
    schema: 'public', // used in PostgreSQL only, `drizzle` by default
  },
});

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

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

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 迁移并将其应用到我们的数据库

📦 <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: "postgresql",
  schema: "./src/schema.ts",
  dbCredentials: {
    url: "postgresql://user:password@host:port/dbname"
  },
  migrations: {
    table: 'journal', 
    schema: 'drizzle', 
  },
});

现在运行

npx drizzle-kit generate --name=init

它将生成

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

CREATE TABLE "users"(
  id serial primary key,
  name text
)

现在运行

npx drizzle-kit migrate

我们的 SQL 迁移现在已成功应用到数据库 ✅