跳到主要内容

规划数据库迁移方案

示例代码库

本节涉及的代码变更可参考示例代码库中的 PR #6

规划迁移方案

本节将讨论在对项目 Ent 模式进行更改时,如何规划新的数据库迁移方案。假设我们需要为 User 实体添加一个名为 title 的新可选字段:

ent/schema/user.go
// 用户字段定义
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("name"),
field.String("email"). // <-- 新增字段
Unique(),
field.String("title").
Optional(),
}
}

添加新字段后,需要重新运行项目的代码生成命令:

go generate ./...

接下来,使用 Atlas CLI 为此次变更创建新的迁移文件:

atlas migrate diff add_user_title \
--dir "file://ent/migrate/migrations" \
--to "ent://ent/schema" \
--dev-url "docker://mysql/8/ent"

此时在 ent/migrate/migrations/ 目录下会生成名为 20221115101649_add_user_title.sql 的新文件,其中包含在 users 表中创建 title 字段的 SQL 语句:

ent/migrate/migrations/20221115101649_add_user_title.sql
-- 修改 "users" 表
ALTER TABLE `users` ADD COLUMN `title` varchar(255) NULL;

成功!我们已使用 Atlas CLI 自动为此次变更生成了迁移文件。

执行以下命令即可应用迁移:

atlas migrate apply --dir file://ent/migrate/migrations --url mysql://root:pass@localhost:3306/db

Atlas 将输出:

正在从版本 20221114165732 迁移至 20221115101649(共 1 个迁移):

-- 应用版本 20221115101649
-> ALTER TABLE `users` ADD COLUMN `title` varchar(255) NULL;
-- 完成 (36.152277ms)

-------------------------
-- 耗时 44.1116ms
-- 执行 1 个迁移
-- 运行 1 条 SQL 语句

下一节我们将讨论如何为项目规划自定义模式迁移方案。