Comment puis-je lot sql avec une base de données des paquets.sql
Comment puis-je le lot des instructions sql avec Golang de la base de données.sql package?
En Java, je voudrais faire comme ceci :
//Create a prepared statement
String sql = "INSERT INTO my_table VALUES(?)";
PreparedStatement pstmt = connection.prepareStatement(sql);
//Insert 10 rows of data
for (int i=0; i<10; i++) {
pstmt.setString(1, ""+i);
pstmt.addBatch();
}
//Execute the batch
int [] updateCounts = pstmt.executeBatch();
Comment puis-je obtenir le même dans Golang?
- Je ne crois pas qu'une telle chose existe dans le sql package.
- Il n'y a pas de package de base de données".sql" dans le jeu de Go.
Vous devez vous connecter pour publier un commentaire.
Depuis le
db.Exec
fonction est variadic, une option (qui en fait ne fait que de faire un seul aller-retour réseau) est de construire l'énoncé de vous-même et de faire exploser les arguments et les transmettre.Exemple de code:
Dans un simple test que j'ai couru, cette solution est environ 4 fois plus rapide, à l'insertion de 10 000 lignes de la Commencer, Préparer, de s'Engager présenté dans l'autre réponse - bien que l'amélioration réelle dépend de votre installation individuelle, les latences réseau, etc.
db.Begin(); <code from above but with tx.Exec>; db.Commit()
à exécuter tous comme une seule transaction. Aussi, ce est sécurité contre les injections SQL, car il utilise la?
des espaces réservés.Si vous utilisez PostgreSQL puis pq prend en charge les importations en vrac.
Expansion sur Avi Lin réponse, j'avais besoin d'un CONFLIT N'clause de mise à JOUR dans mon INSERT.
La solution est de COPIER une table temporaire (à supprimer à la fin de la transaction), puis l'INSÉRER à partir de la table temporaire à la table permanente.
Voici le code que j'ai réglé sur:
Adaptation Andrew solution pour PostgreSQL, qui ne supporte pas la
?
espace réservé, les ouvrages suivants:i
paramètre (valueStrings sera($1, $2, $3),($4, $5, $6),...
). LeExampleRowStruct
s sont transmis uniquement à la db.Exec, où le pilote de base de données prend soin de remplacer les espaces réservés.Ici est un regard sur @Debasish Mitra's solution si vous utilisez Postgres.
Fonctionnement exemple: https://play.golang.org/p/dFFD2MrEy3J
Autre exemple: https://play.golang.org/p/vUtW0K4jVMd
func ReplaceSQL
Le dosage n'est pas possible via les interfaces disponibles dans la base de données/sql. Un particulier pilote de base de données peut charge séparément, cependant. Par exemple https://github.com/ziutek/mymysql apparaît à l'appui de dosage avec MySQL.
Pour Postgres lib pq prend en charge des insertions: https://godoc.org/github.com/lib/pq#hdr-Bulk_imports
Mais la même chose peut être atteint par le biais de code ci-dessous mais où il est vraiment utile c'est lorsque l'on tente d'effectuer en vrac conditionnelle de mise à jour (modifier la requête en conséquence).
Pour la réalisation de semblables insertions pour Postgres, vous pouvez utiliser la fonction suivante.
Donc au-dessus de l'échantillon devient
Prendre l'idée de Andrew C et de les adapter à un besoin dans mon travail à l'aide de sql variables scalaires. Il fonctionne parfaitement pour que l'obligation spécifique dans mon travail. C'est peut-être utile à quelqu'un parce qu'il est utile pour simuler lot opérations de sql dans golang. C'est l'idée.
Une bonne bibliothèque pour chercher la chaîne syntaxe est
go-pg
https://github.com/go-pg/pg/wiki/Writing-Queries#insert
Insérer plusieurs livres avec une seule requête: