UPDATE
Le mieux est de lire l'article suivant : Importations de données .
En tant qu'auteur de pg-promesse Je me suis senti obligé de fournir enfin la bonne réponse à la question, car celle publiée précédemment ne lui rendait pas vraiment justice.
Afin d'insérer un nombre massif/infini d'enregistrements, votre approche doit se baser sur la méthode séquence qui est disponible dans les tâches et les transactions.
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
});
Il s'agit de la meilleure approche pour insérer un nombre massif de lignes dans la base de données, tant du point de vue des performances que de la limitation de la charge.
Tout ce que vous avez à faire est d'implémenter votre fonction getData
en fonction de la logique de votre application, c'est-à-dire de l'endroit d'où proviennent vos données volumineuses, en fonction de la index
de la séquence, pour renvoyer quelque 1 000 à 10 000 objets à la fois, en fonction de la taille des objets et de la disponibilité des données.
Voir aussi quelques exemples d'API :
Question connexe : node-postgres avec une quantité massive de requêtes .
Et dans les cas où vous avez besoin d'acquérir les identifiants générés de tous les enregistrements insérés, vous devez modifier les deux lignes comme suit :
// return t.none(insert);
return t.map(insert + 'RETURNING id', [], a => +a.id);
y
// db.tx(t => t.sequence(source))
db.tx(t => t.sequence(source, {track: true}))
mais faites attention, car garder trop d'identifiants d'enregistrement en mémoire peut créer une surcharge.