参考 this 帮助文档,如果存在语法
db.DropTableIfExists(&User{}, "products")
有一个删除表,但对于 db.Model(&User{}).DropColumn("description")
DropColumnIfExists 不存在。我应该用什么来实现 DropColumn(如果该列存在,否则不存在。)
我应该使用什么来实现 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")
}
}
更新 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")
}
这应该有效:
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
}