AKTUALIZUJ
Najlepiej przeczytać następujący artykuł:Import danych .
Jako autor pg-promise Musiałem w końcu udzielić właściwej odpowiedzi na to pytanie, ponieważ ta opublikowana wcześniej nie była tak naprawdę sprawiedliwa.
Aby wstawić ogromną/nieskończoną liczbę rekordów, Twoje podejście powinno opierać się na metodzie sekwencja , który jest dostępny w ramach zadań i transakcji.
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
});
Jest to najlepsze podejście do wstawiania ogromnej liczby wierszy do bazy danych, zarówno z punktu widzenia wydajności, jak i ograniczania obciążenia.
Wszystko, co musisz zrobić, to zaimplementować swoją funkcję getData
zgodnie z logiką Twojej aplikacji, tj. skąd pochodzą Twoje duże dane, na podstawie index
sekwencji, aby zwrócić około 1000 - 10 000 obiektów na raz, w zależności od wielkości obiektów i dostępności danych.
Zobacz także kilka przykładów API:
Powiązane pytanie:node-postgres z ogromną liczbą zapytań .
A w przypadkach, w których musisz uzyskać wygenerowane identyfikatory wszystkich wstawionych rekordów, możesz zmienić dwie linie w następujący sposób:
// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);
i
// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))
po prostu bądź ostrożny, ponieważ przechowywanie zbyt wielu identyfikatorów rekordów w pamięci może spowodować przeciążenie.