Jeg er forfatter til pg-promise .
Der er to måder at indsætte flere poster på. Den første og mest typiske måde er via en transaktion at sikre, at alle poster er indsat korrekt, eller ingen af dem.
Med pg-promise det gøres på følgende måde:
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
});
Du starter en transaktion med metoden tx
, og opret derefter alle INSERT
forespørgselsløfter, og løs dem alle som en batch
.
Den anden tilgang er ved at sammenkæde alle insert-værdier i en enkelt INSERT
forespørgsel, som jeg forklarer detaljeret i Performance Boost
. Se også:Multi-row insert with pg-promise a> .
For flere eksempler se Opgaver og Transaktioner .
Tilføjelse
Det er værd at påpege, at vi i de fleste tilfælde ikke indsætter en post id
, hellere få det genereret automatisk. Nogle gange ønsker vi at få de nye id-er tilbage, og i andre tilfælde er vi ligeglade.
Eksemplerne ovenfor løses med en matrix af null
-s, fordi batch
løses med en række individuelle resultater og metode ingen
løses med null
, ifølge dets API.
Lad os antage, at vi ønsker at generere de nye id-er, og at vi ønsker at få dem alle tilbage. For at opnå dette ville vi ændre koden til følgende:
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
});
dvs. ændringerne er:
- vi indsætter ikke
id
værdier - vi erstatter metoden ingen med one , for at få en række/objekt fra hver indsætning
- vi tilføjer
RETURNING id
til forespørgslen for at få værdien - vi tilføjer
a => +a.id
for at udføre den automatiske rækketransformation. Se også pg-promise returnerer heltal som strenge at forstå, hvad det+
er til.
OPDATERING-1
For en højtydende tilgang via en enkelt INSERT
forespørgsel se Multi-row insert with pg-promise .
OPDATERING-2
En artikel, der skal læses:Dataimport .