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 .