为了账号安全,请及时绑定邮箱和手机立即绑定

使用自动迁移删除未使用的列

使用自动迁移删除未使用的列

Go
慕桂英3389331 2022-08-01 15:27:36
我已经开始与梦幻般的图书馆GORM合作。自动迁移工作完美,但在文档中,我阅读了注释“它不会删除未使用的列以保护您的数据”。我可以跳过此规则吗?换句话说,我是否可以在gorm配置中添加/更改某些内容,以便有机会使用自动迁移删除未使用的列?
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

你可以这样写一个函数:


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{})


查看完整回答
反对 回复 2022-08-01
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

不,我不认为有一个简单的选择来做到这一点。

以下是自动迁移源:https://github.com/go-gorm/gorm/blob/59730417aabd5b510d66d9d923d265a6fc0195a0/migrator/migrator.go#L83-L153

您需要枚举表上的所有列,检查它们是否存在,然后将其删除。

您还需要枚举现有关系和索引,如果它们不存在,则根据需要将其删除。

如果你最终写了它,我认为你可以编写自己的函数,该函数采用接口并运行自动迁移。可以在现有代码中获取迁移器接口,并将其传递给函数。也许有人在某个地方写了这样的函数!AutoMigrategorm.Migratordb.Migrator()


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号