2013-05-27 3 views
1

J'ai beaucoup de fichiers .txt où chaque ligne a des données que je veux ajouter à un modèle, de sorte qu'il peut être prêt pour l'interrogation. Le problème est qu'aucune des requêtes "insert" n'est exécutée, probablement en raison de l'asynchronicité de la bibliothèque.Comment ajouter beaucoup de données au modèle Sequelize?

Voici ce que j'ai:

// Connect to DB 
// Set up Model 
// Model.sync() 

// first for loop (for each .txt) 
// second for loop (nested) (for each line in the .txt) 
// in second for loop: Model.create(data); 

Que dois-je faire pour vous assurer que chaque objet de données est ajouté avec succès à la base de données?

Voici le code:

var Location = sequelize.define('Location', { 
    name: Sequelize.STRING, 
    country: Sequelize.STRING, 
    lat: Sequelize.STRING, 
    long: Sequelize.STRING 
}); 
Location.sync().success(function(){ 
    for (var i = 0; i < txts.length; i++){ 
    var txt = txts[i], 
     country = txt.substr(0, txt.indexOf('.')), 
     data = fs.readFileSync(dir +"/" + txt, 'utf-8'), 
     locations = data.split('\n'); 

    for (var j =1; j < locations.length; j++){ 
     var loc = locations[j], 
     chunks = _.without(loc.split('\t'), ''), 
     lat = chunks[3], 
     long = chunks[4], 
     name = chunks[16] 

     Location.build({ 
     country: country, 
     lat: lat, 
     long: long, 
     name: name 
     }) 
     .save() 
     .success(function(){ 
      console.log('success'); 
     }) 
     .error(function(err){ 
      if (err) throw err; 
     }); 
    } 

} 

J'ai essayé d'utiliser la méthode foreach lodash pour itérer à travers les boucles mais les deux méthodes semblent sauter sur la Location.build()

Répondre

0

Difficile à dire sans voir le code réel, mais essayez d'utiliser fs.readFileSync ou, de préférence, utilisez async.each ou async.auto pour vos boucles, de sorte que la boucle externe se termine réellement avant l'exécution de la boucle interne.

+0

J'ai ajouté le code que j'ai. Est-ce que async.each ferait la même chose que _.forEach? Le problème n'est-il pas asynchrone ici, pas la solution? – ehsangh

+1

Je crois que cela devrait marcher avec async.eachSeries. Ce qui est difficile à comprendre à propos de Node, c'est que sans utiliser de fonction de rappel ou de fonction asynchrone, Node progresse tout au long de vos boucles externes et internes et passe à l'élément suivant sans attendre que la sauvegarde ait lieu. Je recommande de commencer avec 3 fichiers et d'ajouter des instructions console.log pour voir le flux de contrôle en action. Cela va vous surprendre. – dankohn

Questions connexes