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 .