UPDATE
Am besten ist es in dem folgenden Artikel zu lesen: Data Imports.
Als Autor pg-promise ich gezwungen war, endlich auf die Frage die richtige Antwort zu geben, wie die früher veröffentlichte eine wirklich Gerechtigkeit es nicht tun.
Um eine massive/unendliche Anzahl von Datensätzen einzufügen, sollte Ihr Ansatz auf der Methode sequence basieren, die in Tasks und Transaktionen verfügbar ist.
var cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tableName'});
// returns a promise with the next array of data objects,
// while there is data, or an empty array when no more data left
function getData(index) {
if (/*still have data for the index*/) {
// - resolve with the next array of data
} else {
// - resolve with an empty array, if no more data left
// - reject, if something went wrong
}
}
function source(index) {
var t = this;
return getData(index)
.then(data => {
if (data.length) {
// while there is still data, insert the next bunch:
var insert = pgp.helpers.insert(data, cs);
return t.none(insert);
}
// returning nothing/undefined ends the sequence
});
}
db.tx(t => t.sequence(source))
.then(data => {
// success
})
.catch(error => {
// error
});
Dies ist der beste Ansatz zum Einfügen einer großen Anzahl von Zeilen in die Datenbank, sowohl vom Leistungspunkt als auch von der Lastdrosselung.
Alles, was Sie tun müssen, ist die Implementierung Ihrer Funktion getData
entsprechend der Logik Ihrer App, dh wo Ihre großen Daten stammen, basierend auf der index
der Sequenz, um einige 1.000 - 10.000 Objekte auf einmal zurückzugeben, abhängig von der Größe der Objekte und der Datenverfügbarkeit.
Siehe auch einige API Beispiele:
Verwandte Frage: node-postgres with massive amount of queries.
Und in Fällen, in denen Sie benötigen erzeugt id-s aller eingefügten Datensätze zu erwerben, können Sie die beiden Linien ändern würde, wie folgt:
// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);
und
// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))
nur Seien Sie vorsichtig, wenn Sie zu viele Record-IDs im Speicher halten, kann dies zu einer Überlastung führen.
Besser spät als nie, da ich endlich Zeit hatte, Ihre Frage erneut zu lesen und die richtige Antwort innerhalb der bestehenden [pg-promise] (https://github.com/vitaly-t/pg-promise) API zu geben ;) –
Vielen Dank für Ihre Antwort @ vitaly-t, ich habe es implementiert und es funktioniert jetzt! Ich werde Ihre Antwort akzeptieren, weil ich denke, dass es eine bessere Implementierung ist, die Sequenz statt Batch verwendet. –