PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Insertion de plusieurs enregistrements avec pg-promise

Je suis l'auteur de pg-promise .

Il existe deux manières d'insérer plusieurs enregistrements. Le premier moyen, et le plus courant, consiste à effectuer une transaction pour s'assurer que tous les enregistrements sont insérés correctement, ou aucun d'entre eux.

Avec pg-promise cela se fait de la manière suivante :

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
    });

Vous initiez une transaction avec la méthode tx , puis créez tous les INSERT requêtes promises, puis résolvez-les toutes en tant que batch .

La deuxième approche consiste à concaténer toutes les valeurs d'insertion dans un seul INSERT requête, que j'explique en détail dans Performance Boost . Voir aussi :Insert multi-lignes avec pg-promise .

Pour plus d'exemples, voir Tâches et Transactions .

Ajout

Il convient de souligner que dans la plupart des cas, nous n'insérons pas d'enregistrement id , plutôt qu'il soit généré automatiquement. Parfois, nous voulons récupérer les nouveaux identifiants, et dans d'autres cas, nous ne nous en soucions pas.

Les exemples ci-dessus résolvent avec un tableau de null -s, car lot résout avec un tableau de résultats individuels et la méthode none se résout avec null , selon son API.

Supposons que nous voulions générer les nouveaux identifiants et que nous voulions tous les récupérer. Pour ce faire, nous modifierions le code comme suit :

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
    });

c'est-à-dire que les modifications sont :

  • nous n'insérons pas l'id valeurs
  • nous remplaçons la méthode none avec un , pour obtenir une ligne/un objet de chaque insertion
  • nous ajoutons RETURNING id à la requête pour obtenir la valeur
  • on ajoute a => +a.id pour effectuer la transformation automatique des lignes. Voir aussi pg-promise renvoie des entiers sous forme de chaînes pour comprendre ce que + est pour.

MISE À JOUR-1

Pour une approche performante via un seul INSERT requête voir insertion multi-lignes avec pg-promise .

MISE À JOUR-2

Un article à lire absolument :Importations de données .