sql >> Database teknologi >  >> RDS >> PostgreSQL

Flerrækket indsats med pg-løfte

Jeg er forfatter til pg-promise.

I ældre versioner af biblioteket var dette dækket af forenklede eksempler i Performance Boost-artiklen, som stadig er god læsning, når du skriver højtydende databaseapplikationer.

Den nyere tilgang er at stole på hjælpernes navneområde, som i sidste ende er fleksibelt og optimeret til ydeevne.

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

Se API:ColumnSet, indsæt.

Sådan en indsættelse kræver ikke engang en transaktion, for hvis et sæt værdier ikke kan indsættes, vil ingen indsætte.

Og du kan bruge den samme tilgang til at generere en af ​​følgende forespørgsler:

  • enkelt række INSERT
  • multi-row INSERT
  • enkelt række UPDATE
  • flerrækket UPDATE

Er indsættelser med ${}-notation beskyttet mod sql-injektion?

Ja, men ikke alene. Hvis du indsætter skema-/tabel-/kolonnenavne dynamisk, er det vigtigt at bruge SQL-navne, som i kombination vil beskytte din kode mod SQL-injektion.

Relateret spørgsmål:PostgreSQL-opdateringer med flere rækker i Node.js

ekstramateriale

Sp.:Sådan får du id af hver ny rekord på samme tid?

A: Simpelthen ved at tilføje RETURNING id til din forespørgsel, og udføre den med metode mange:

const query = pgp.helpers.insert(values, cs) + ' RETURNING id';
    
const res = await db.many(query);
//=> [{id: 1}, {id: 2}, ...]

eller endnu bedre, få id-erne og konverter resultatet til en række heltal ved hjælp af metodekort:

const res = await db.map(query, undefined, a => +a.id);
//=> [1, 2, ...]

For at forstå, hvorfor vi brugte + der, se:pg-promise returnerer heltal som strenge.

OPDATERING-1

For at indsætte et stort antal poster, se Dataimport.

OPDATERING-2

Ved at bruge v8.2.1 og nyere kan du pakke den statiske forespørgselsgenerering ind i en funktion, så den kan genereres inden for forespørgselsmetoden, for at afvise, når forespørgselsgenereringen mislykkes:

// 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. ODP.NET Managed bibliotek løser alias, men 32-bit bibliotek gør

  2. FEJL 1130 (HY000):Vært '' har ikke tilladelse til at oprette forbindelse til denne MySQL-server

  3. Duplikere en MySQL-tabel, indekser og data

  4. CONVERT() vs TRY_CONVERT i SQL Server:Hvad er forskellen?