PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Sisipan multi-baris dengan pg-promise

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);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle setara dengan Postgres 'DISTINCT ON?

  2. Tampilan Drop Postgresql

  3. Bagaimana Tanh() Bekerja di PostgreSQL

  4. Penyeimbangan Beban PostgreSQL Menggunakan HAProxy &Keepalive

  5. Baris perintah Windows PSQL:apakah ada cara untuk mengizinkan login tanpa kata sandi?