2017-10-09 80 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