【发布时间】:2021-01-09 19:42:46
【问题描述】:
我已经开始使用出色的 Go 库 GORM。自动迁移完美运行,但在文档中我阅读了注释“它不会删除未使用的列来保护您的数据。”
我可以跳过这条规则吗?换句话说,我可以在 gorm 配置中添加/更改某些内容,以便有机会使用自动迁移删除未使用的列吗?
【问题讨论】:
我已经开始使用出色的 Go 库 GORM。自动迁移完美运行,但在文档中我阅读了注释“它不会删除未使用的列来保护您的数据。”
我可以跳过这条规则吗?换句话说,我可以在 gorm 配置中添加/更改某些内容,以便有机会使用自动迁移删除未使用的列吗?
【问题讨论】:
不,我认为这不是一个简单的选择。
这里是 AutoMigrate 源:https://github.com/go-gorm/gorm/blob/59730417aabd5b510d66d9d923d265a6fc0195a0/migrator/migrator.go#L83-L153
您需要枚举表中的所有列,检查它们是否存在,然后删除它们。
您还需要枚举现有的关系和索引,如果它们不存在,则根据需要删除它们。
如果你最终写了那个,我认为你可以编写自己的 AutoMigrate 函数,该函数采用 gorm.Migrator 接口并运行自动迁移。您可以使用 db.Migrator() 在现有代码中获取 Migrator 接口并将其传递给您的函数。也许有人在某处写过这样的函数!
【讨论】:
你可以这样写一个函数:
func DropUnusedColumns(dst interface{}) {
stmt := &gorm.Statement{DB: DB}
stmt.Parse(dst)
fields := stmt.Schema.Fields
columns, _ := DB.Debug().Migrator().ColumnTypes(dst)
for i := range columns {
found := false
for j := range fields {
if columns[i].Name() == fields[j].DBName {
found = true
break
}
}
if !found {
DB.Migrator().DropColumn(dst, columns[i].Name())
}
}
}
用法:
DropUnusedColumns(&User{})
【讨论】: