2016-03-21 15 views
5

Próbuję utworzyć insert zbiorczy. Używam Gorm github.com/jinzhu/gormGolang Dołącz do interfejsu tablicowego

import (
    "fmt" 
    dB "github.com/edwinlab/api/repositories" 
) 

func Update() error { 
    tx := dB.GetWriteDB().Begin() 
    sqlStr := "INSERT INTO city(code, name) VALUES (?, ?),(?, ?)" 
    vals := []interface{}{} 

    vals = append(vals, "XX1", "Jakarta") 
    vals = append(vals, "XX2", "Bandung") 

    tx.Exec(sqlStr, vals) 

    tx.Commit() 

    return nil 
} 

Ale mam błąd:

Error 1136: Column count doesn't match value count at row 1 becuse i return wrong query

INSERT INTO city(code, name) VALUES ('XX1','Jakarta','XX2','Bandung', %!v(MISSING)),(%!v(MISSING), %!v(MISSING)) 

Gdybym użyć ręcznego zapytanie to działa:

tx.Exec(sqlStr, "XX1", "Jakarta", "XX2", "Bandung") 

To wygeneruje:

INSERT INTO city(code, name) VALUES ('XX1', 'Jakarta'),('XX2', 'Bandung') 

Problem polega na tym, jak utworzyć tablicę terface do generowania ciągów takich jak "XX1", "Jakarta", ...

Dzięki za pomoc.

+0

czy miałeś na myśli to, że chcesz wstawić dwie dane za pomocą jednego zapytania? – Kasnady

+0

Tak, chcę wstawić wiele danych jednocześnie Moje odniesienie jest http://stackoverflow.com/a/21112176/2486312 – user2486312

Odpowiedz

4

Jeśli chcesz przekazać elementy przekroju do funkcji z parametrem variadic, musisz użyć ..., aby powiedzieć kompilatorowi, że chcesz przekazać wszystkie elementy pojedynczo i nie przekazywać wartości przekroju jako pojedynczego argumentu, więc po prostu wykonaj :

tx.Exec(sqlStr, vals...) 

Jest to szczegółowe w specyfikacji: Passing arguments to ... parameters.

Tx.Exec() ma podpis:

func (tx *Tx) Exec(query string, args ...interface{}) (Result, error) 

Więc trzeba przejść vals.... Nie zapomnij również sprawdzić zwróconego błędu, np .:

res, err := tx.Exec(sqlStr, vals...) 
if err != nil { 
    // handle error 
} 
+0

Dzięki pracy jest moja wina myślę ... tylko próbki: | – user2486312