2016-05-02 8 views
1

Mit gorp wie kann man mehrere Datensätze effizient einfügen? d. h., statt einzeln zu setzen, gibt es einen Batch-Einsatz?golang gorp mehrere Datensätze einfügen

var User struct { 
    Name string 
    Email string 
    Phone string 
} 
var users []Users 
users = buildUsers() 
dbMap.Insert(users...) //this fails compilation 
//I am forced to loop over users and insert one user at a time. Error Handling omitted for brevity 

Gibt es einen besseren Mechanismus mit Gorp? Treiber ist MySQL.

Antwort

0

Es sieht nicht so aus, als ob GORP irgendetwas hat, das einen Wrapper für entweder SQL- oder Multi-Value-Einfügungen liefert (was immer SQL-Dialekt-abhängig ist).
Sorgen Sie sich um Geschwindigkeit oder Transaktionen? Wenn nicht, würde ich die Inserts nur in einer for-Schleife machen.

3

Wie ich auf einer anderen Ressource herausgefunden, der Grund, dass dies nicht funktioniert, ist, dass interface{} und User{} nicht das gleiche Layout im Speicher haben, daher sind ihre Scheiben nicht von kompatiblen Typen. Vorgeschlagene Lösung war []User{} in []interface{} in for-Schleife zu konvertieren, wie hier gezeigt: https://golang.org/doc/faq#convert_slice_of_interface

Es gibt immer noch auf Nachteil ist: Sie müssen Zeiger für DbMap.Insert() Funktion verwenden.

Hier ist, wie ich es gelöst:

s := make([]interface{}, len(users)) 
for i, v := range users { 
    s[i] = &v 
} 
err := dbMap.Insert(s...) 

Hinweis dass &v wichtig ist, sonst Insert wird über nicht-Zeiger beschweren.