Saya penulis pg-promise.
Dalam versi pustaka yang lebih lama, hal ini dicakup oleh contoh yang disederhanakan dalam artikel Peningkatan Kinerja, yang masih merupakan bacaan yang baik saat menulis aplikasi basis data berkinerja tinggi.
Pendekatan yang lebih baru adalah mengandalkan namespace helper, yang pada akhirnya fleksibel, dan dioptimalkan untuk kinerja.
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);
Lihat API:ColumnSet, masukkan.
Penyisipan semacam itu bahkan tidak memerlukan transaksi, karena jika satu set nilai gagal dimasukkan, tidak ada yang akan dimasukkan.
Dan Anda dapat menggunakan pendekatan yang sama untuk membuat kueri berikut:
- baris tunggal
INSERT
- multi-baris
INSERT
- baris tunggal
UPDATE
UPDATE
multi-baris
Apakah penyisipan menggunakan notasi ${} terlindungi dari injeksi sql?
Ya, tapi tidak sendirian. Jika Anda memasukkan nama skema/tabel/kolom secara dinamis, penting untuk menggunakan Nama SQL, yang jika digabungkan akan melindungi kode Anda dari injeksi SQL.
Pertanyaan terkait:Pembaruan multi-baris PostgreSQL di Node.js
tambahan
T:Bagaimana cara mendapatkan id
setiap rekor baru secara bersamaan?
J: Cukup dengan menambahkan RETURNING id
ke kueri Anda, dan menjalankannya dengan metode many:
const query = pgp.helpers.insert(values, cs) + ' RETURNING id';
const res = await db.many(query);
//=> [{id: 1}, {id: 2}, ...]
atau bahkan lebih baik, dapatkan id-s, dan ubah hasilnya menjadi array bilangan bulat, menggunakan peta metode:
const res = await db.map(query, undefined, a => +a.id);
//=> [1, 2, ...]
Untuk memahami mengapa kami menggunakan +
di sana, lihat:pg-promise mengembalikan bilangan bulat sebagai string.
PERBARUI-1
Untuk memasukkan sejumlah besar catatan, lihat Impor Data.
PERBARUI-2
Dengan menggunakan v8.2.1 dan yang lebih baru, Anda dapat membungkus pembuatan kueri statis ke dalam suatu fungsi, sehingga dapat dibuat dalam metode kueri, untuk ditolak saat pembuatan kueri gagal:
// 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);