数据库迁移设计

数据库 schema 迁移的设计:版本化 SQL 文件、up/down 可回滚、启动时自动执行、与 GORM AutoMigrate 的区别。

#type / concept #status / growing #tech / dev / backend #resource / go

[!info] related notes

数据库迁移设计

核心问题

不用迁移时建表靠手动 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 撤销变更。

设计原则

  1. 迁移文件不可修改 — 已执行的不要改,有问题写新的
  2. 每个迁移原子化 — 一个迁移做一件事
  3. down 必须可逆 — up 做了什么,down 就能完全撤销
  4. 启动时自动执行 — 应用启动时 migrate.Up()
  5. 测试环境先跑 — 验证后再上生产

与 GORM AutoMigrate 的区别

维度golang-migrateAutoMigrate
控制粒度完全手写 SQL自动生成
回滚支持不支持
删列支持不支持
数据迁移支持不支持
适用生产环境开发快速迭代

两者可以共存:开发时 AutoMigrate 快速迭代,迁移文件同步维护。

创建于 2026/6/25 更新于 2026/6/25