Tôi là tác giả của pg-promise .
Có hai cách để chèn nhiều bản ghi. Cách đầu tiên và điển hình nhất là thông qua một giao dịch, để đảm bảo rằng tất cả các bản ghi đều được chèn chính xác hoặc không có bản ghi nào trong số chúng.
Với pg-promise nó được thực hiện theo cách sau:
db.tx(t => {
const queries = lst.map(l => {
return t.none('INSERT INTO table(id, key, value) VALUES(${id}, ${key}, ${value})', l);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of null-s
})
.catch(error => {
// ERROR
});
Bạn bắt đầu giao dịch bằng phương thức tx
, sau đó tạo tất cả INSERT
truy vấn lời hứa và sau đó giải quyết tất cả chúng dưới dạng lô
.
Cách tiếp cận thứ hai là ghép tất cả các giá trị chèn vào một INSERT
duy nhất truy vấn mà tôi giải thích chi tiết trong Tăng hiệu suất
. Xem thêm: Chèn nhiều hàng với pg-promise .
Để biết thêm ví dụ, hãy xem Tasks và Giao dịch .
Bổ sung
Cần chỉ ra rằng trong hầu hết các trường hợp, chúng tôi không chèn bản ghi id
, thay vì nó được tạo tự động. Đôi khi chúng tôi muốn lấy lại id-s mới và trong những trường hợp khác, chúng tôi không quan tâm.
Các ví dụ trên giải quyết bằng một mảng null
-s, bởi vì lô
giải quyết bằng một loạt các kết quả riêng lẻ và phương pháp không có
giải quyết bằng null
, theo API của nó.
Giả sử rằng chúng ta muốn tạo id-s mới và chúng ta muốn lấy lại tất cả. Để thực hiện điều này, chúng tôi sẽ thay đổi mã thành như sau:
db.tx(t => {
const queries = lst.map(l => {
return t.one('INSERT INTO table(key, value) VALUES(${key}, ${value}) RETURNING id',
l, a => +a.id);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of new id-s;
})
.catch(error => {
// ERROR
});
tức là những thay đổi là:
- chúng tôi không chèn
id
giá trị - chúng tôi thay thế phương pháp không có với một , để lấy một hàng / đối tượng từ mỗi lần chèn
- chúng tôi thêm
RETURNING id
vào truy vấn để nhận giá trị - chúng tôi thêm
a => +a.id
để thực hiện chuyển đổi hàng tự động. Xem thêm pg-promise trả về số nguyên dưới dạng chuỗi để hiểu điều đó+
dành cho.
CẬP NHẬT-1
Để có cách tiếp cận hiệu suất cao thông qua một INSERT
duy nhất truy vấn xem Chèn nhiều hàng với pg-promise .
CẬP NHẬT-2
Bài viết phải đọc: Nhập dữ liệu .