5月29日 01:21

GORM 的 AutoMigrate 功能如何使用?

AutoMigrate 根据 Go 结构体的 tag 自动创建表、添加缺失的列和索引,是纯增量操作——不会删除列、不会修改列类型、不会重命名列。这意味着一旦某列被创建,即使结构体中删除了该字段,数据库中仍会保留。对于列类型变更(如 string 改为 text),AutoMigrate 静默跳过。生产环境不应依赖 AutoMigrate,应使用 golang-migrate 等版本化迁移工具,AutoMigrate 仅适合开发和快速原型阶段。

追问

  • AutoMigrate 检测到列类型不匹配时会怎样?会报错吗?
  • 如何手动删除一列?db.Migrator().DropColumn() 在生产环境有什么风险?
  • AutoMigrate 对已存在的表修改索引的行为是什么?
  • 多个服务同时启动时 AutoMigrate 会冲突吗?如何保证迁移安全?
  • db.Migrator().HasTable()db.Migrator().HasColumn() 在实际迁移逻辑中怎么用?

写段代码

go
type User struct { gorm.Model Name string `gorm:"size:100;not null"` Email string `gorm:"uniqueIndex"` } // 只做增量,不会删除旧列 db.AutoMigrate(&User{}) // 手动操作需用 Migrator db.Migrator().DropColumn(&User{}, "OldField")
标签:Gorm