sql >> Database >  >> RDS >> PostgreSQL

Meerdere rijen invoegen met pg-promise

Ik ben de auteur van pg-promise.

In oudere versies van de bibliotheek werd dit behandeld door vereenvoudigde voorbeelden in het Performance Boost-artikel, dat nog steeds goed leesbaar is bij het schrijven van krachtige databasetoepassingen.

De nieuwere benadering is om te vertrouwen op de naamruimte van de helpers, die uiteindelijk flexibel is en geoptimaliseerd voor prestaties.

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

Zie API:ColumnSet, invoegen.

Zo'n invoeging vereist zelfs geen transactie, want als een set waarden niet kan worden ingevoegd, wordt er geen ingevoegd.

En u kunt dezelfde aanpak gebruiken om een ​​van de volgende zoekopdrachten te genereren:

  • één rij INSERT
  • multi-rij INSERT
  • één-rij UPDATE
  • multi-rij UPDATE

Zijn invoegingen met ${}-notatie beschermd tegen sql-injectie?

Ja, maar niet alleen. Als u schema-/tabel-/kolomnamen dynamisch invoegt, is het belangrijk om SQL-namen te gebruiken, die in combinatie uw code beschermen tegen SQL-injectie.

Gerelateerde vraag:PostgreSQL-updates met meerdere rijen in Node.js

extra's

V:Hoe krijg ik id van elk nieuw record tegelijk?

A: Simpelweg door RETURNING id . toe te voegen aan uw zoekopdracht, en voer deze uit met methode veel:

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

of nog beter, verkrijg de id-s en converteer het resultaat naar een array van gehele getallen, met behulp van de methodemap:

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

Om te begrijpen waarom we + . hebben gebruikt zie daar:pg-promise retourneert gehele getallen als strings.

UPDATE-1

Voor het invoegen van een groot aantal records, zie Gegevensimport.

UPDATE-2

Met v8.2.1 en hoger kunt u het genereren van statische query's in een functie inpakken, zodat deze binnen de querymethode kan worden gegenereerd, om te weigeren wanneer het genereren van query's mislukt:

// 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. voorwaardelijk meedoen in mysql

  2. MySQL zoeken en tekst in een veld vervangen

  3. Android - Hoe kan ik gegevens met betrekking tot twee tabellen doorgeven aan een invoegmethode van een inhoudsprovider?

  4. Kan kolom dbo of de door de gebruiker gedefinieerde functie of geaggregeerde dbo.Splitfn niet vinden, of de naam is dubbelzinnig