2014-05-06 8 views
1

J'essaie d'insérer plusieurs (centaines/milliers) d'enregistrements dans la base de données MySQL. Mon problème est que je ne suis pas vraiment sûr de la meilleure façon de le faire. Exemple:NodeJS - Comment insérer plusieurs lignes dans MySQL

function saveData(data, callback) { 
    var dataLength = data.length, 
     saved = []; 

    for (var i = 0; i < dataLength; i++) { 
     db.query("INSERT INTO table VALUES (?, ?, ?)", data[i], function(err, res) { 
      if (err) { 
       // ... 
      } 

      saved.push(res.insertId); 
     }); 
    } 
} 

Le problème est que, après toutes les données sont enregistrées (enregistrer [] contient tous les ID) Je dois passer ce tableau à un rappel. Évidemment je ne peux pas le faire immédiatement ... Je dois attendre que toutes les questions soient faites. Les questions: Dois-je utiliser pour la boucle ou est-il préférable de le faire de manière récursive (L'insertion suivante sera appelée après que le précédent est fait), devrais-je vérifier si saved.length === dataLength puis retourner le tableau ou est il y a une meilleure façon de le faire?

+0

aussi longtemps que tout s'en mémoire je ne vois rien de mal à votre solution – soulcheck

+0

Je ne peux pas décider est préférable d'exécuter toutes les requêtes à la fois puis attendez les résultats ou mieux exécuter une seule requête, attendre un résultat et en exécuter un autre. J'utilise la connexion pooling donc la requête va être conn.query (...); – 0101

+0

J'utilise le module node-mysql2. Je pensais que les requêtes à une base de données fonctionne comme asynchrone de sorte que je peux enregistrer (disons) dix rappels à dix attendent juste le résultat. Ai-je tort? – 0101

Répondre

2

Voici comment vous pouvez le faire avec async:

function saveData(data, cb) { 
    async.mapSeries(data, function(queryData, callback) { 
    db.query("INSERT INTO table VALUES (?, ?, ?)", queryData, function(err, res) { 
     if (err) 
     callback(err); 
     else 
     callback(null, res.insertId); 
    }); 
    }, cb); 
    // cb will be passed `err, saved` 
} 
Questions connexes