PERBARUI
Yang terbaik adalah membaca artikel berikut:Impor Data .
Sebagai penulis pg-promise Saya terpaksa akhirnya memberikan jawaban yang tepat untuk pertanyaan itu, karena yang diterbitkan sebelumnya tidak benar-benar adil.
Untuk memasukkan catatan dalam jumlah besar/tak terbatas, pendekatan Anda harus didasarkan pada metode urutan , yang tersedia dalam tugas dan transaksi.
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
});
Ini adalah pendekatan terbaik untuk memasukkan sejumlah besar baris ke dalam database, baik dari sudut pandang kinerja maupun pembatasan beban.
Yang harus Anda lakukan adalah mengimplementasikan fungsi Anda getData
sesuai dengan logika aplikasi Anda, yaitu dari mana data besar Anda berasal, berdasarkan index
urutan, untuk mengembalikan sekitar 1.000 - 10.000 objek sekaligus, tergantung pada ukuran objek dan ketersediaan data.
Lihat juga beberapa contoh API:
Pertanyaan terkait:node-postgres dengan sejumlah besar kueri .
Dan dalam kasus di mana Anda perlu memperoleh id-s yang dihasilkan dari semua catatan yang dimasukkan, Anda akan mengubah dua baris sebagai berikut:
// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);
dan
// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))
hati-hati saja, karena menyimpan terlalu banyak id-record di memori dapat menyebabkan kelebihan beban.