DropColumn(如果 GORM 中存在)

问题描述 投票:0回答:3

参考 this 帮助文档,如果存在语法

db.DropTableIfExists(&User{}, "products")
有一个删除表,但对于
db.Model(&User{}).DropColumn("description")
DropColumnIfExists 不存在。我应该用什么来实现 DropColumn(如果该列存在,否则不存在。)

go go-gorm
3个回答
6
投票

我应该使用什么来实现 DropColumn(如果该列存在,否则不存在。)

回答你的问题...

继续吧。您可以使用

db.Model(&User{}).DropColumn("description")

优雅地处理错误。记住,在 Golang 中,错误就是值

func main() {
    db.AutoMigrate(&User{})

    err := db.Model(&User{}).DropColumn("description").Error
    if err != nil {
        // Do whatever you want to do!
        log.Print("ERROR: We expect the description column to be 
drop-able")
    }
}

在引擎盖下,gorm 将执行原始 postgresql 查询(如果它没有错误)。否则,它将返回错误


1
投票

更新 Mohsin 截至 2021 年的答案:

我应该使用什么来实现 DropColumn(如果该列存在,否则不存在。)

当前版本(3.5.5)不再支持2017年的语法/api

来自 GORM 迁移参考

err = db.Migrator().DropColumn(&AuthUser{}, "name")
if err != nil {
    // Do whatever you want to do!
    log.Print("ERROR: We expect the description column to be drop-able")
}

0
投票

这应该有效:

func getTableName(db *gorm.DB, dst interface{}) string {
    stmt := &gorm.Statement{DB: db}
    if err := stmt.Parse(dst); err != nil {
        return fmt.Sprintf("\"unknown; error parsing schema: %+v\"", err)
    }
    return stmt.Schema.Table
}

func dropColumnIfExists(db *gorm.DB, dst interface{}, field string) error {
    if db.Migrator().HasColumn(dst, field) {
        if err := db.Migrator().DropColumn(dst, field); err != nil {
            return fmt.Errorf("unable to drop the %s column from table %s due to error: %+v", field, getTableName(db, dst), err)
        }
    } else {
        log.Printf("Table %s no longer has a column named %s; skipping.", getTableName(db, dst), field)
    }

    return nil
}
© www.soinside.com 2019 - 2024. All rights reserved.