Tôi là tác giả của pg-promise.
Trong các phiên bản cũ hơn của thư viện, điều này đã được đề cập đến bởi các ví dụ đơn giản trong bài viết về Performance Boost, đây vẫn là một bài đọc tốt khi viết các ứng dụng cơ sở dữ liệu hiệu suất cao.
Cách tiếp cận mới hơn là dựa vào không gian tên của trình trợ giúp, không gian này cuối cùng là linh hoạt và được tối ưu hóa cho hiệu suất.
const pgp = require('pg-promise')({
/* initialization options */
capSQL: true // capitalize all generated SQL
});
const db = pgp(/*connection*/);
// our set of columns, to be created only once (statically), and then reused,
// to let it cache up its formatting templates for high performance:
const cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tmp'});
// data input values:
const values = [{col_a: 'a1', col_b: 'b1'}, {col_a: 'a2', col_b: 'b2'}];
// generating a multi-row insert query:
const query = pgp.helpers.insert(values, cs);
//=> INSERT INTO "tmp"("col_a","col_b") VALUES('a1','b1'),('a2','b2')
// executing the query:
await db.none(query);
Xem API:ColumnSet, insert.
Việc chèn như vậy thậm chí không yêu cầu một giao dịch, bởi vì nếu một bộ giá trị không thể chèn, thì sẽ không có bộ giá trị nào được chèn.
Và bạn có thể sử dụng cùng một cách tiếp cận để tạo bất kỳ truy vấn nào sau đây:
- một hàng
INSERT
- nhiều hàng
INSERT
- một hàng
UPDATE
- nhiều hàng
UPDATE
Các chèn sử dụng ký hiệu $ {} có được bảo vệ chống lại việc tiêm sql không?
Có, nhưng không phải một mình. Nếu bạn đang chèn động các tên lược đồ / bảng / cột, thì điều quan trọng là phải sử dụng Tên SQL, kết hợp này sẽ bảo vệ mã của bạn khỏi bị chèn SQL.
Câu hỏi liên quan:Cập nhật nhiều hàng PostgreSQL trong Node.js
tính năng bổ sung
Hỏi:Cách lấy id
của từng bản ghi mới cùng một lúc?
Đ: Chỉ cần thêm RETURNING id
cho truy vấn của bạn và thực thi nó bằng nhiều phương pháp:
const query = pgp.helpers.insert(values, cs) + ' RETURNING id';
const res = await db.many(query);
//=> [{id: 1}, {id: 2}, ...]
hoặc thậm chí tốt hơn, lấy id-s và chuyển đổi kết quả thành mảng các số nguyên, bằng cách sử dụng bản đồ phương thức:
const res = await db.map(query, undefined, a => +a.id);
//=> [1, 2, ...]
Để hiểu tại sao chúng tôi sử dụng +
ở đó, hãy xem:pg-promise trả về số nguyên dưới dạng chuỗi.
CẬP NHẬT-1
Để chèn một số lượng lớn các bản ghi, hãy xem Nhập dữ liệu.
CẬP NHẬT-2
Sử dụng v8.2.1 trở lên, bạn có thể bao bọc tạo truy vấn tĩnh thành một hàm, vì vậy nó có thể được tạo trong phương thức truy vấn, để từ chối khi tạo truy vấn không thành công:
// generating a multi-row insert query inside a function:
const query = () => pgp.helpers.insert(values, cs);
//=> INSERT INTO "tmp"("col_a","col_b") VALUES('a1','b1'),('a2','b2')
// executing the query as a function that generates the query:
await db.none(query);