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

Inserti massicci con pg-promise

AGGIORNAMENTO

La cosa migliore è leggere il seguente articolo:Importazioni di dati .

Come autore di pg-promise Alla fine sono stato costretto a fornire la risposta giusta alla domanda, poiché quella pubblicata in precedenza non le rendeva davvero giustizia.

Per inserire un numero enorme/infinito di record, il tuo approccio dovrebbe essere basato sul metodo sequenza , disponibile all'interno di attività e transazioni.

var cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tableName'});

// returns a promise with the next array of data objects,
// while there is data, or an empty array when no more data left
function getData(index) {
    if (/*still have data for the index*/) {
        // - resolve with the next array of data
    } else {
        // - resolve with an empty array, if no more data left
        // - reject, if something went wrong
    }        
}

function source(index) {
    var t = this;
    return getData(index)
        .then(data => {
            if (data.length) {
                // while there is still data, insert the next bunch:
                var insert = pgp.helpers.insert(data, cs);
                return t.none(insert);
            }
            // returning nothing/undefined ends the sequence
        });
}

db.tx(t => t.sequence(source))
    .then(data => {
        // success
    })
    .catch(error => {
        // error
    });

Questo è l'approccio migliore per inserire un numero enorme di righe nel database, sia dal punto di vista delle prestazioni che della limitazione del carico.

Tutto quello che devi fare è implementare la tua funzione getData secondo la logica della tua app, ovvero da dove provengono i tuoi dati di grandi dimensioni, in base all'index della sequenza, per restituire circa 1.000 - 10.000 oggetti alla volta, a seconda delle dimensioni degli oggetti e della disponibilità dei dati.

Vedi anche alcuni esempi di API:

Domanda correlata:node-postgres con un'enorme quantità di query .

E nei casi in cui devi acquisire gli ID generati di tutti i record inseriti, cambieresti le due righe come segue:

// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);

e

// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))

fai solo attenzione, poiché tenere troppi ID di record in memoria può creare un sovraccarico.