sql >> Database teknologi >  >> RDS >> PostgreSQL

Indsættelse af flere poster med pg-løfte

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 .




  1. Kommandoer ude af synkronisering; du kan ikke køre denne kommando nu

  2. Skinner migration Opret tabel primær nøgle

  3. Bordet er fyldt (med MEMORY-motor)

  4. hvilken forespørgsel skal vi bruge til at opdele 1colmnn i flere kolonner