АКТУАЛИЗАЦИЯ
Най-добре е да прочетете следната статия:Импортиране на данни .
Като автор на pg-promise Бях принуден най-накрая да дам правилния отговор на въпроса, тъй като този, публикуван по-рано, всъщност не го представи правилно.
За да вмъкнете огромен/безкраен брой записи, вашият подход трябва да се основава на метод последователност , който е достъпен в задачите и транзакциите.
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
});
Това е най-добрият подход за вмъкване на огромен брой редове в базата данни както от гледна точка на производителността, така и от ограничаване на натоварването.
Всичко, което трябва да направите, е да внедрите вашата функция getData
според логиката на вашето приложение, т.е. откъде идват вашите големи данни, въз основа на index
от последователността, за да върне около 1000 - 10 000 обекта наведнъж, в зависимост от размера на обектите и наличността на данни.
Вижте също някои примери за API:
Свързан въпрос:node-postgres с огромно количество заявки .
И в случаите, когато трябва да придобиете генерирани идентификатори на всички вмъкнати записи, бихте променили двата реда, както следва:
// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);
и
// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))
просто бъдете внимателни, тъй като съхраняването на твърде много идентификатори на записи в паметта може да доведе до претоварване.