【问题标题】:Delete unused columns with Auto Migration使用自动迁移删除未使用的列
【发布时间】:2021-01-09 19:42:46
【问题描述】:

我已经开始使用出色的 Go 库 GORM。自动迁移完美运行,但在文档中我阅读了注释“它不会删除未使用的列来保护您的数据。”

我可以跳过这条规则吗?换句话说,我可以在 gorm 配置中添加/更改某些内容,以便有机会使用自动迁移删除未使用的列吗?

【问题讨论】:

    标签: go migration go-gorm


    【解决方案1】:

    不,我认为这不是一个简单的选择。

    这里是 AutoMigrate 源:https://github.com/go-gorm/gorm/blob/59730417aabd5b510d66d9d923d265a6fc0195a0/migrator/migrator.go#L83-L153

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

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

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

    【讨论】:

      【解决方案2】:

      你可以这样写一个函数:

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

      【讨论】:

        猜你喜欢
        • 2019-01-29
        • 2011-02-19
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 1970-01-01
        • 2019-12-29
        • 1970-01-01
        • 2017-06-17
        相关资源
        最近更新 更多