sql >> Databasteknik >  >> RDS >> PostgreSQL

Infogar flera poster med pg-promise

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 .




  1. Hur konverterar man en sekvens av tecken till ett datumformat för att lagra i databasen?

  2. Använder MySQL Data Reader

  3. Oracle JDBC intermittent anslutningsproblem

  4. Hur man använder en ringdatastruktur i fönsterfunktioner