UPDATE
最好的是閱讀下面的文章:Data Imports。
由於pg-promise我身不由己,最後給出了正確答案的問題筆者,作爲一個早些時候發表並沒有真正做到公正。
爲了插入大量/無限數量的記錄,您的方法應基於方法sequence,這在任務和事務中可用。
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
,您的大數據來自何處,以一次返回大約1,000-10,000個對象,取決於對象的大小和數據的可用性。
也看到一些API的例子:
相關問題:node-postgres with massive amount of queries。
而且在您需要獲得所有插入的記錄生成的ID-S的情況下,你會改變兩行如下:
// 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}))
剛要小心,因爲在記憶中保留太多記錄ID可能會造成過載。
比從未更好的遲到,因爲我終於有時間重新閱讀您的問題,並在現有的[pg-promise](https://github.com/vitaly-t/pg-promise)API中提供正確的答案;) –
非常感謝您的回覆@ vitaly-t,我實現了它,現在它正在工作!我會接受你的回答,因爲我認爲這是使用序列而不是批處理的更好實現。 –