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

Inserimento di più record con pg-promise

Sono l'autore di pg-promise .

Esistono due modi per inserire più record. Il primo e più tipico modo è tramite una transazione, per assicurarsi che tutti i record siano inseriti correttamente o nessuno di essi.

Con pg-promise si fa nel modo seguente:

db.tx(t => {
    const queries = lst.map(l => {
        return t.none('INSERT INTO table(id, key, value) VALUES(${id}, ${key}, ${value})', l);
    });
    return t.batch(queries);
})
    .then(data => {
        // SUCCESS
        // data = array of null-s
    })
    .catch(error => {
        // ERROR
    });

Si avvia una transazione con il metodo tx , quindi crea tutti i INSERT interrogare le promesse, quindi risolverle tutte come batch .

Il secondo approccio consiste nel concatenare tutti i valori di inserimento in un singolo INSERT query, che spiego in dettaglio in Incremento delle prestazioni . Vedi anche:Inserimento a più righe con pg-promise .

Per ulteriori esempi, vedere Attività e Transazioni .

Aggiunta

Vale la pena sottolineare che nella maggior parte dei casi non inseriamo un record id , piuttosto farlo generare automaticamente. A volte vogliamo recuperare i nuovi ID, in altri casi non ci interessa.

Gli esempi precedenti si risolvono con un array di null -s, perché batch si risolve con una serie di risultati individuali e il metodo none si risolve con null , secondo la sua API.

Supponiamo di voler generare i nuovi id-s e di riaverli tutti indietro. Per fare ciò cambieremmo il codice come segue:

db.tx(t => {
    const queries = lst.map(l => {
        return t.one('INSERT INTO table(key, value) VALUES(${key}, ${value}) RETURNING id',
                       l, a => +a.id);
    });
    return t.batch(queries);
})
    .then(data => {
        // SUCCESS
        // data = array of new id-s;
    })
    .catch(error => {
        // ERROR
    });

ovvero le modifiche sono:

  • non inseriamo l'id valori
  • sostituiamo il metodo none con uno , per ottenere una riga/oggetto da ogni inserto
  • aggiungiamo RETURNING id alla query per ottenere il valore
  • aggiungiamo a => +a.id per eseguire la trasformazione automatica delle righe. Vedi anche pg-promise restituisce interi come stringhe per capire cosa quel + è per.

AGGIORNAMENTO-1

Per un approccio ad alte prestazioni tramite un singolo INSERT query vedi Inserimento a più righe con pg-promise .

AGGIORNAMENTO-2

Un articolo da leggere:Importazioni di dati .