Skip to content
Charles
Go back

Go 数据库迁移方案对比

Updated:
Edit page

生产迁移的核心是让数据库变更可审查、可追踪,并能配合应用发布。Go 方案主要分为版本化迁移(提交并按序执行迁移文件)和声明式迁移(根据目标 Schema 生成差异)。生产环境通常应执行已审核的版本化迁移。

先给结论

场景推荐选择理由
手写 SQL,追求简单透明golang-migrateSQL 文件、CLI 和 Go API 都直接
需要 SQL 和 Go 函数迁移goose支持 embed.FS,可用 Go 处理复杂回填
自动生成迁移并做 CI 风险检查Atlas支持 Schema diff、版本化迁移和 lint
原型、测试库或可重建数据库GORM AutoMigrate / Ent Automatic Migration无需维护完整迁移历史

如果没有 ORM 约束,SQL 项目从 golang-migrate 开始;需要 Go 代码参与迁移时选 goose;需要 Schema diff 和 CI 检查时再引入 Atlas。

版本化和声明式迁移

版本化迁移把每次变更保存为有序文件。文件进入生产后应视为历史记录;要修复问题,就新增迁移。它容易审查,但需要开发者明确处理改名、数据回填和索引构建。

声明式工具根据当前和目标 Schema 生成差异,能减少重复 DDL。生成结果仍需审查:工具未必知道字段改名要保留数据,也无法替你决定如何分阶段发布。稳妥做法是生成版本化 SQL,提交到 Git 后再执行。

常见方案

golang-migrate

SQL-first 的版本化迁移工具,提供 CLI 和 Go 库,可与 database/sql、sqlx、sqlc 等配合。

goose

支持 SQL 文件和 Go migration,也支持将迁移嵌入二进制。

Atlas

支持从 Schema 或 ORM 模型生成迁移,并对迁移做 lint。可用于 GORM、Ent 等项目,也能与现有执行器组合。

GORM AutoMigrate 和 Ent Automatic Migration

两者都能按模型创建或调整 Schema,适合本地开发和可随时重建的测试库。GORM AutoMigrate 不会自动删除旧列;Ent Automatic Migration 默认偏向追加变更。Ent 也支持通过 Atlas 生成版本化迁移。

不建议把运行时自动对齐作为重要生产数据库的默认流程:它缺少清晰的变更审查与发布边界,大表 DDL 也可能锁表或耗时。

能力对比

方案迁移输入自动生成 SQLCI 风险检查生产建议
golang-migrateSQL否需自行组合适合
gooseSQL / Go否需自行组合适合
AtlasSchema / ORM是内置 lint用版本化工作流
GORM / Ent 自动迁移ORM 模型是需自行组合仅限开发或可重建库

生产实践

参考资料

相关主题:项目选型。


Edit page
Share this post:

Previous Post
Go 新语法示例
Next Post
注册中心项目对比