Ik ben de auteur van pg-promise .
Er zijn twee manieren om meerdere records in te voegen. De eerste en meest gebruikelijke manier is via een transactie om ervoor te zorgen dat alle records correct zijn ingevoerd, of geen ervan.
Met pg-promise het gaat op de volgende manier:
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
});
U start een transactie met methode tx
en maak vervolgens alle INSERT
vraag belooft, en los ze vervolgens allemaal op als een batch
.
De tweede benadering is door alle invoegwaarden samen te voegen tot een enkele INSERT
query, die ik in detail uitleg in Performance Boost
. Zie ook:Invoegen met meerdere rijen met pg-promise .
Zie voor meer voorbeelden Taken en Transacties .
Toevoeging
Het is de moeite waard om erop te wijzen dat we in de meeste gevallen geen record id
. invoegen , laat het liever automatisch genereren. Soms willen we de nieuwe ID's terug, en in andere gevallen maakt het ons niet uit.
De bovenstaande voorbeelden worden opgelost met een array van null
-s, omdat batch
lost op met een reeks individuele resultaten en methode none
lost op met null
, volgens de API.
Laten we aannemen dat we de nieuwe id-s willen genereren, en dat we ze allemaal terug willen krijgen. Om dit te bereiken zouden we de code als volgt wijzigen:
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
});
d.w.z. de wijzigingen zijn:
- we voegen de
id
niet in waarden - we vervangen methode geen met één , om één rij/object uit elke invoeging te krijgen
- we voegen
RETURNING id
toe naar de query om de waarde te krijgen - we voegen
a => +a.id
. toe om de automatische rijtransformatie uit te voeren. Zie ook pg-promise retourneert gehele getallen als tekenreeksen om te begrijpen wat dat+
is voor.
UPDATE-1
Voor een krachtige aanpak via een enkele INSERT
query zie Invoegen met meerdere rijen met pg-promise .
UPDATE-2
Een artikel dat je gelezen moet hebben:Gegevensimport .