2017-10-09 388 views
1

我使用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{})直接我没有得到任何错误。

我意识到我不需要辅助函数,但我想知道为什么辅助函数不起作用,特别是因为这是我第一次使用可变参数函数。

谢谢:)

回答

1

敢肯定你只需要做:

err := db.AutoMigrate(models...).Error 

可变参数函数接受的参数作为类型片。在这种情况下,您的功能将收到名为models[]interface{}。当您将该参数传递给db.AutoMigrate时,您将其作为[]interface{}类型的单个参数传递。

你真正想要的是将参数中的每个值作为单独的参数传递(与接收它们的方式相同)。为此,您必须使用...语法。

0

您只需将模型作为可变参数传递给您的automigrate调用即可。 Automigrate接受多个模型参数(如db.AutoMigrate(model1{}, model2{}, model3{})),而不是数组。

我把这里的模拟打印字符串扔在一起: https://play.golang.org/p/qPTLqBvsen