Je suis l'auteur de pg-promise .
Il existe deux manières d'insérer plusieurs enregistrements. Le premier moyen, et le plus courant, consiste à effectuer une transaction pour s'assurer que tous les enregistrements sont insérés correctement, ou aucun d'entre eux.
Avec pg-promise cela se fait de la manière suivante :
db.tx(t => {
const queries = lst.map(l => {
return t.none('INSERT INTO table(id, key, value) VALUES(${id}, ${key}, ${value})', l);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of null-s
})
.catch(error => {
// ERROR
});
Vous initiez une transaction avec la méthode tx
, puis créez tous les INSERT
requêtes promises, puis résolvez-les toutes en tant que batch
.
La deuxième approche consiste à concaténer toutes les valeurs d'insertion dans un seul INSERT
requête, que j'explique en détail dans Performance Boost
. Voir aussi :Insert multi-lignes avec pg-promise .
Pour plus d'exemples, voir Tâches et Transactions .
Ajout
Il convient de souligner que dans la plupart des cas, nous n'insérons pas d'enregistrement id
, plutôt qu'il soit généré automatiquement. Parfois, nous voulons récupérer les nouveaux identifiants, et dans d'autres cas, nous ne nous en soucions pas.
Les exemples ci-dessus résolvent avec un tableau de null
-s, car lot
résout avec un tableau de résultats individuels et la méthode none
se résout avec null
, selon son API.
Supposons que nous voulions générer les nouveaux identifiants et que nous voulions tous les récupérer. Pour ce faire, nous modifierions le code comme suit :
db.tx(t => {
const queries = lst.map(l => {
return t.one('INSERT INTO table(key, value) VALUES(${key}, ${value}) RETURNING id',
l, a => +a.id);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of new id-s;
})
.catch(error => {
// ERROR
});
c'est-à-dire que les modifications sont :
- nous n'insérons pas l'
id
valeurs - nous remplaçons la méthode none avec un , pour obtenir une ligne/un objet de chaque insertion
- nous ajoutons
RETURNING id
à la requête pour obtenir la valeur - on ajoute
a => +a.id
pour effectuer la transformation automatique des lignes. Voir aussi pg-promise renvoie des entiers sous forme de chaînes pour comprendre ce que+
est pour.
MISE À JOUR-1
Pour une approche performante via un seul INSERT
requête voir insertion multi-lignes avec pg-promise .
MISE À JOUR-2
Un article à lire absolument :Importations de données .