PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Einfügen mehrerer Datensätze mit pg-promise

Ich bin der Autor von pg-promise .

Es gibt zwei Möglichkeiten, mehrere Datensätze einzufügen. Der erste und typischste Weg ist über eine Transaktion, um sicherzustellen, dass alle Datensätze richtig eingefügt werden, oder keiner von ihnen.

Mit pg-promise Dies geschieht auf folgende Weise:

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
    });

Sie initiieren eine Transaktion mit der Methode tx , erstellen Sie dann alle INSERT Abfrageversprechen und lösen Sie sie dann alle als Batch auf .

Der zweite Ansatz besteht darin, alle Insert-Werte zu einem einzigen INSERT zu verketten Abfrage, die ich ausführlich in Performance Boost erkläre . Siehe auch:Mehrreihige Einfügung mit pg-promise .

Weitere Beispiele finden Sie unter Aufgaben und Transaktionen .

Zusatz

Es sei darauf hingewiesen, dass wir in den meisten Fällen keinen Datensatz id einfügen , sondern automatisch generieren lassen. Manchmal möchten wir die neuen IDs zurückbekommen, und in anderen Fällen ist es uns egal.

Die obigen Beispiele werden mit einem Array von null aufgelöst -s, weil Batch löst mit einem Array von Einzelergebnissen und der Methode none auf wird mit null aufgelöst , gemäß seiner API.

Nehmen wir an, wir wollen die neuen IDs generieren und sie alle zurückbekommen. Um dies zu erreichen, würden wir den Code wie folgt ändern:

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.h. die Änderungen sind:

  • wir fügen die id nicht ein Werte
  • Wir ersetzen die Methode none mit one , um eine Zeile/ein Objekt von jeder Einfügung zu erhalten
  • Wir hängen RETURNING id an zur Abfrage, um den Wert abzurufen
  • wir fügen a => +a.id hinzu um die automatische Zeilentransformation durchzuführen. Siehe auch pg-promise gibt ganze Zahlen als Strings zurück zu verstehen, was das + ist ist für.

UPDATE-1

Für einen performanten Ansatz über ein einziges INSERT Abfrage siehe Mehrzeilige Einfügung mit pg-promise .

UPDATE-2

Ein Pflichtartikel:Datenimporte .