OPDATERING
Det bedste er at læse følgende artikel:Dataimport .
Som forfatter til pg-promise Jeg var tvunget til endelig at give det rigtige svar på spørgsmålet, da det tidligere offentliggjorte ikke rigtig gjorde det retfærdigt.
For at indsætte et massivt/uendeligt antal poster, bør din tilgang være baseret på metoden sekvens , der er tilgængelig inden for opgaver og transaktioner.
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
});
Dette er den bedste tilgang til at indsætte et stort antal rækker i databasen, både set fra ydeevnesynspunkt og belastningsbegrænsning.
Alt du skal gøre er at implementere din funktion getData
i henhold til logikken i din app, dvs. hvor dine store data kommer fra, baseret på index
af sekvensen for at returnere omkring 1.000 - 10.000 objekter ad gangen, afhængigt af størrelsen af objekter og datatilgængelighed.
Se også nogle API-eksempler:
Relateret spørgsmål:node-postgres med enorme mængder af forespørgsler .
Og i tilfælde, hvor du har brug for at erhverve genererede id-er for alle de indsatte poster, vil du ændre de to linjer som følger:
// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);
og
// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))
Bare vær forsigtig, da det kan skabe en overbelastning at holde for mange registrerings-id'er i hukommelsen.