2017-10-09 20 views
1

私はGo-GORMを使用してゴーロックDBクラスタに接続します。私は、接続を処理し、部品を自動移行するヘルパー関数を書いた。 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 

}

私は次のエラーを取得:私はエラーを取得していない直接gorm.DB.AutoMigrate(&models.Resurce{}, models.Right{})を呼び出すと

pq: empty table name: "\"\"" 

を。

私はヘルパー関数が必要ではないことを認識していますが、ヘルパー関数がなぜ機能しないのかを知りたいと思います。特に、私のバリアント関数を初めて使ったからです。

おかげで:)

答えて

1

かなり確信してあなただけ実行する必要があります。

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

可変個引数関数は、タイプのスライスとして引数を受け取ります。この場合、あなたの関数はmodelsという[]interface{}を受け取ります。その引数をdb.AutoMigrateに渡すと、それをタイプ[]interface{}の1つの引数として渡しています。

本当に必要なのは、argsの各値を別々の引数として渡すことです(受け取ったのと同じ方法)。これを行うには、...構文を使用する必要があります。

0

あなたは、オートマチックコールの変数argとしてモデルを渡す必要があります。 Automigrateは、配列ではなく複数のモデルパラメータ(db.AutoMigrate(model1{}, model2{}, model3{})のように)を受け入れます。 https://play.golang.org/p/qPTLqBvsen

私は一緒にここに遊び場で文字列を印刷するアナログの例を投げました