我已经开始使用出色的GORM for Go库。自动迁移工作得很好,但在文档中我读到了"它不会删除未使用的列来保护您的数据">
我可以跳过这个规则吗?换句话说,我可以在gorm配置中添加/更改一些内容,以便有机会使用自动迁移删除未使用的列吗?
不,我认为这不是一个简单的选择。
以下是AutoMigrate源:https://github.com/go-gorm/gorm/blob/59730417aabd5b510d66d9d923d265a6fc0195a0/migrator/migrator.go#L83-L153
您需要枚举表上的所有列,检查它们是否存在,然后删除它们。
您还需要枚举现有的关系和索引,如果它们不存在,则根据需要进行删除。
如果您最终写了这篇文章,我认为您可以编写自己的AutoMigrate
函数,该函数使用gorm.Migrator
接口并运行automigrate。您可以使用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{})