Jag är författare till pg-promise .
Det finns två sätt att infoga flera poster. Det första och mest typiska sättet är via en transaktion att se till att alla poster infogas korrekt, eller ingen av dem.
Med pg-promise det görs på följande sätt:
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 initierar en transaktion med metoden tx
, skapa sedan alla INSERT
fråga löften och lös sedan dem alla som en batch
.
Den andra metoden är att sammanfoga alla infogningsvärden till en enda INSERT
fråga, som jag förklarar i detalj i Performance Boost
. Se även:Multi-row insert with pg-promise .
För fler exempel se Uppgifter och Transaktioner .
Tillägg
Det är värt att påpeka att vi i de flesta fall inte infogar en post id
, hellre ha det genererat automatiskt. Ibland vill vi få tillbaka de nya id-numren, och i andra fall bryr vi oss inte.
Exemplen ovan löser sig med en array av null
-s, eftersom batch
löser sig med en rad individuella resultat och metod ingen
löser sig med null
, enligt dess API.
Låt oss anta att vi vill generera de nya id-numren och att vi vill få tillbaka dem alla. För att åstadkomma detta skulle vi ändra koden till följande:
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.v.s. ändringarna är:
- vi infogar inte
id
värden - vi ersätter metoden ingen med one , för att få en rad/objekt från varje infogning
- vi lägger till
RETURNING id
till frågan för att få värdet - vi lägger till
a => +a.id
för att göra den automatiska radomvandlingen. Se även pg-promise returnerar heltal som strängar att förstå vad det+
är för.
UPPDATERING-1
För ett högpresterande tillvägagångssätt via en enda INSERT
fråga se Multi-row insert with pg-promise .
UPPDATERING-2
En artikel som måste läsas:Dataimport .