跳转至内容
There is a version suitable for your browser's language settings. Would you like to go to the english language of the site?
主页文档

Drizzle Kit

H1

当我们在代码中设计好表结构后,这些表在数据库中尚不存在。为了将这些设计同步到数据库中,我们可以利用 Drizzle Kit 工具。

配置

为了使用 Drizzle Kit,我们需创建一个配置文件 /drizzle.config.ts

/drizzle.config.ts
import type { Config } from "drizzle-kit";
import { env } from "node:process";
const drizzleConfig: Config = {
schema: "./generated/database-schema.ts",
out: "./drizzle",
dialect: "mysql", // "postgresql" | "mysql"
dbCredentials: {
host: env.DB_HOST ?? "your-default-database-url",
port: Number(env.DB_PORT) ?? 3306,
user: env.DB_USERNAME ?? "your-default-username",
password: env.DB_PASSWORD ?? "your-default-password",
database: env.DB_DATABASE ?? "your-default-database",
},
};
export default drizzleConfig;

通过修改上述配置,您可以指定使用 MySQL 或 PostgreSQL 数据库。配置完成后,编写一个脚本,通过运行它来生成同步数据库所需的 SQL 语句。

迁移

Drizzle Kit 提供两种迁移模式:推送模式和生成模式。开发阶段通常使用推送模式,部署时则采用生成模式。

推送模式

推送模式会直接更新数据库,使其与本地表结构保持一致,但不会删除已删除的表或字段。

/drizzle.migrate.push.ts
#!/usr/bin/env bun
import { $ } from "bun";
import { exit } from "node:process";
// 使用推送模式运行 Drizzle Kit
await $`bun x drizzle-kit push`;
exit(0);

若使用 PostgreSQL,请将上述代码中的 mysql 替换为 pg

生成模式

生成模式将分析当前表结构与上次运行时的差异,并生成相应的 SQL 文件。

生成模式更为安全,因为它允许您明确了解对数据库的每一次变更,从而避免意外的负面影响。

/drizzle.migrate.gen.ts
#!/usr/bin/env bun
import { $ } from "bun";
import { exit } from "node:process";
console.log("Drizzle 正在迁移...");
const config = await import("./drizzle.config.ts");
const schema = await import("./generated/database-schema.ts");
// 以生成模式运行 Drizzle Kit
const { execSync } = await import("node:child_process");
await $`bun x drizzle-kit generate`;
// 加载 Drizzle 并执行迁移文件
const mysql = await import("mysql2/promise");
const { drizzle } = await import("drizzle-orm/mysql2");
const { migrate } = await import("drizzle-orm/mysql2/migrator");
const connection = await mysql.createConnection(config.default.dbCredentials);
const db = drizzle(connection, { schema, mode: "default" });
await migrate(db, { migrationsFolder: "drizzle" });
console.log("Drizzle 迁移完成!");
exit(0);

请根据实际使用的数据库调整上述代码中的 MySQL 相关部分。

运行 Drizzle Kit

完成上述步骤后,您就可以运行 Drizzle Kit 进行测试了。确保至少创建了一张表。

终端窗口
bun run ./drizzle.migrate.push.ts

如果您希望简化命令输入,可以在 VS Code 的 Milkio 扩展 菜单栏 中添加该命令。

/milkio.toml
[menubar]
commands = [
{ name = 'Drizzle Kit', script = 'bun run ./drizzle.migrate.push.ts' },
{ name = '测试所有 API', script = 'bun run ./index.ts --run-mode:API_TEST' },
]

部署

通常情况下,本地开发使用的数据库与生产环境中的数据库是不同的。因此,在更新服务器代码时,记得运行 bun run ./drizzle.migrate.push.ts 以保持数据库与代码同步。

Drizzle Studio

Drizzle Kit 随附的 Drizzle Studio 提供了一个数据库浏览器,您可以通过简单的命令在本地启动它。

终端窗口
bun x drizzle-kit studio --port 3000

同样地,您也可以在 VS Code 的 Milkio 扩展 菜单栏 中添加该命令以方便访问。

/milkio.toml
[menubar]
commands = [
{ name = 'Drizzle Studio', script = 'bun x drizzle-kit studio --port 3000' },
{ name = '测试所有 API', script = 'bun run ./index.ts --run-mode:API_TEST' },
]