数据库迁移设计
数据库 schema 迁移的设计:版本化 SQL 文件、up/down 可回滚、启动时自动执行、与 GORM AutoMigrate 的区别。
#type / concept
#status / growing
#tech / dev / backend
#resource / go
[!info] related notes
- 相关: gorm
数据库迁移设计
核心问题
不用迁移时建表靠手动 SQL 或 GORM AutoMigrate:
- 手动 SQL:多人协作容易遗漏
- AutoMigrate:只能加列,不能删列、改类型、做数据迁移
迁移让每次 schema 变更有版本号、有可回滚的 SQL、多人自动同步。
迁移文件
migrations/
├── 000001_create_users.up.sql # 正向
├── 000001_create_users.down.sql # 回滚
├── 000002_create_sessions.up.sql
└── 000002_create_sessions.down.sql
每个迁移一对文件:up 做变更,down 撤销变更。
设计原则
- 迁移文件不可修改 — 已执行的不要改,有问题写新的
- 每个迁移原子化 — 一个迁移做一件事
- down 必须可逆 — up 做了什么,down 就能完全撤销
- 启动时自动执行 — 应用启动时
migrate.Up() - 测试环境先跑 — 验证后再上生产
与 GORM AutoMigrate 的区别
| 维度 | golang-migrate | AutoMigrate |
|---|---|---|
| 控制粒度 | 完全手写 SQL | 自动生成 |
| 回滚 | 支持 | 不支持 |
| 删列 | 支持 | 不支持 |
| 数据迁移 | 支持 | 不支持 |
| 适用 | 生产环境 | 开发快速迭代 |
两者可以共存:开发时 AutoMigrate 快速迭代,迁移文件同步维护。