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()在实际迁移逻辑中怎么用?
写段代码
gotype User struct { gorm.Model Name string `gorm:"size:100;not null"` Email string `gorm:"uniqueIndex"` } // 只做增量,不会删除旧列 db.AutoMigrate(&User{}) // 手动操作需用 Migrator db.Migrator().DropColumn(&User{}, "OldField")