CẬP NHẬT
Tốt nhất là đọc bài viết sau: Nhập dữ liệu .
Là tác giả của pg-promise Cuối cùng tôi buộc phải đưa ra câu trả lời đúng cho câu hỏi, vì câu trả lời được xuất bản trước đó không thực sự thực sự công bằng.
Để chèn số lượng lớn / vô hạn bản ghi, phương pháp của bạn phải dựa trên phương pháp trình tự , có sẵn trong các nhiệm vụ và giao dịch.
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
});
Đây là cách tiếp cận tốt nhất để chèn một số lượng lớn các hàng vào cơ sở dữ liệu, từ cả quan điểm hiệu suất và điều chỉnh tải.
Tất cả những gì bạn phải làm là triển khai hàm getData
của bạn theo logic của ứng dụng, tức là dữ liệu lớn của bạn đến từ đâu, dựa trên index
của chuỗi, để trả về khoảng 1.000 - 10.000 đối tượng cùng một lúc, tùy thuộc vào kích thước của đối tượng và tính khả dụng của dữ liệu.
Xem thêm một số ví dụ về API:
Câu hỏi liên quan: node-postgres với lượng truy vấn lớn .
Và trong trường hợp bạn cần lấy id-s đã tạo của tất cả các bản ghi được chèn vào, bạn sẽ thay đổi hai dòng như sau:
// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);
và
// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))
chỉ cần cẩn thận, vì giữ quá nhiều id bản ghi trong bộ nhớ có thể tạo ra tình trạng quá tải.