Go GORM db.Automigrate
问题描述:
我使用Go-GORM连接到cockrouch数据库集群。我写了一个辅助函数来处理连接和自动迁移部分。一切工作正常,除非我想自动迁移超过1个模型。Go GORM db.Automigrate
err = helperdb.HandleMigrate(db, models.Resource{}, models.Right{})
if err != nil {
helperlog.Log("Clavem", "HandleMigrate", "Error migrating resource:"+err.Error())
return
}
这是辅助功能:
// HandleMigrate ...
func HandleMigrate(db *gorm.DB, models ...interface{}) error {
// this need to be checked
err := db.AutoMigrate(models).Error
if err != nil {
fmt.Println("Error HandleMigrate:" + err.Error())
return err
}
return nil
}
我得到以下错误:
pq: empty table name: "\"\""
当我打电话gorm.DB.AutoMigrate(&models.Resurce{}, models.Right{})
直接我没有得到任何错误。
我意识到我不需要辅助函数,但我想知道为什么辅助函数不起作用,特别是因为这是我第一次使用可变参数函数。
谢谢:)
答
敢肯定你只需要做:
err := db.AutoMigrate(models...).Error
可变参数函数接受的参数作为类型片。在这种情况下,您的功能将收到名为models
的[]interface{}
。当您将该参数传递给db.AutoMigrate
时,您将其作为[]interface{}
类型的单个参数传递。
你真正想要的是将参数中的每个值作为单独的参数传递(与接收它们的方式相同)。为此,您必须使用...
语法。
答
您只需将模型作为可变参数传递给您的automigrate调用即可。 Automigrate接受多个模型参数(如db.AutoMigrate(model1{}, model2{}, model3{})
),而不是数组。
我把这里的模拟打印字符串扔在一起: https://play.golang.org/p/qPTLqBvsen