迁移

关于 Drizzle 最重要的一点是你可以将它的模式作为其他一切的真实来源。
drizzle-kit 是 Drizzle ORM 的 CLI 助手,你可以使用它根据模式更改自动生成 SQL 迁移,或直接将这些更改应用到数据库中。

详细文档见 此处,包含更多扩展示例和步骤解析。

快速开始

声明你的模式

src/schema.ts
import { index, int, mysqlTable, bigint, varchar } from 'drizzle-orm/mysql-core';

export const users = mysqlTable('users', {
  id: bigint('id', { mode: 'number' }).primaryKey().autoincrement(),
  fullName: varchar('full_name', { length: 256 }),
}, (users) => ({
  nameIdx: index('name_idx').on(users.fullName),
}));

export const authOtps = mysqlTable('auth_otp', {
  id: bigint('id', { mode: 'number' }).primaryKey().autoincrement(),
  phone: varchar('phone', { length: 256 }),
  userId: int('user_id').references(() => users.id),
});
💡

模式文件不应该包含除定义数据库模式之外的任何运行时逻辑。 特别注意,数据库连接应该单独定义。 否则,每次运行 drizzle-kit 命令时都会执行该逻辑。

另一方面,与此相关的类型定义是允许的,甚至是鼓励的,因为它们不会在运行时执行。

创建配置

在项目根目录中创建一个 drizzle.config.ts 文件:

drizzle.config.ts
import { defineConfig } from 'drizzle-kit';

export default defineConfig({
  schema: './src/schema.ts',
  out: './drizzle',
  dialect: 'mysql', // 'postgresql' | 'mysql' | 'sqlite'
  dbCredentials: {
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
  },
});

生成迁移

pnpm drizzle-kit generate

这将生成一个迁移 SQL 文件:

drizzle/migrations/0000_migration.sql
CREATE TABLE `users` (
 `id` bigint primary key auto_increment,
 `full_name` varchar(256)
);


CREATE TABLE `auth_otp` (
 `id` bigint primary key auto_increment,
 `phone` varchar(256),
 `user_id` int
);


ALTER TABLE auth_otp ADD CONSTRAINT auth_otp_user_id_users_id_fk FOREIGN KEY (`user_id`) REFERENCES users(`id`) ;
CREATE INDEX name_idx ON users (`full_name`);

执行迁移

Drizzle ORM 被设计为在开发流程的任何时间点使用的选择性解决方案。 你可以通过 Drizzle 运行生成的迁移,也可以将它们视为通用的 SQL 迁移,并使用其他工具运行它们。

要使用 Drizzle 运行迁移,你可以使用每个受支持驱动程序(driver)都可用的 migrate() 辅助函数:

src/db.ts
import { drizzle } from 'drizzle-orm/mysql2';
import mysql from 'mysql2/promise';
import * as schema from './schema';

export const connection = await mysql.createConnection({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  multipleStatements: true,
});

export const db = drizzle(connection, { schema });
src/migrate.ts
import 'dotenv/config';
import { migrate } from 'drizzle-orm/mysql2/migrator';
import { db, connection } from './db';

// 这将在数据库上运行迁移,跳过已应用的迁移
await migrate(db, { migrationsFolder: './drizzle' });

// 不要忘记关闭连接,否则脚本将挂起
await connection.end();
pnpm tsx src/migrate.ts

配置项

  • 自定义迁移表格

默认情况下,有关已执行迁移的所有信息都将存储在数据库内的 __drizzle_migrations 表中, 对于 PostgreSQL,也会存储在drizzle模式中。但是,你可以配置记录的存储位置。

要在数据库内添加一个自定义表格名用于存储迁移,请使用 migrationsTable 选项。

使用示例

await migrate(db, { migrationsFolder: './drizzle', migrationsTable: 'my_migrations' });
  • 自定义迁移模式
💡

仅适用于 PostgreSQL 数据库

要在数据库内添加一个自定义模式名用于存储迁移,请使用 migrationsSchema 选项。

使用示例

await migrate(db, { migrationsFolder: './drizzle', migrationsSchema: 'custom' });
Become a Gold Sponsor