2017-01-16 3 views
0

Ich verwende sequelezer, um die Werte in die lokale Datenbank einzufügen. Es ist ein Setup-Skript, das beim ersten Mal auf dem Server ausgeführt werden muss.synchrone Schleife zum Einfügen von Daten in SQLite

Aufgrund NodeJS „asynchron“ Funktionsaufruf, mein sqlite db wird Sperre bekommen und ich erhalte die folgenden Fehler Unhandled rejection SequelizeTimeoutError: SQLITE_BUSY: database is locked

Hier für meinen Code, dass

var country_json = { 
     "AF": "Afghanistan", 
     "AX": "\u00c5land Islands", 
     "AL": "Albania", 
     //........ 
     "ZW": "Zimbabwe" 
    }; 

for (key in country_json) { 

     console.log("ABUZAR"); 
     console.log(key.toString('utf8') + " " + country_json[key].toString('utf8')); 

     db.country_name.findOrCreate({ 

       where: { 
        country_iso: key.toString('utf8') 
       }, 
       defaults: { 
        country_name: country_json[key].toString('utf8') 
       } 
      }) 
      .spread(function(country, created) { 
       console.log(country.get({ 
       plain: true 
       })); 
       console.log(created); 
      }); 

    } 

ich einig Synchron npm Modul versucht, aber jeder von ihnen scheint es auszuarbeiten. Ich wollte nur wissen, wie man dieses Szenario in Knoten js behandelt.

Antwort

1

Sie können asynchrone Funktionen mit Zyklen, Logik, Rekursion usw. unter Verwendung von SynJS mischen - es führt alle Schritte synchron nacheinander aus. Im Folgenden finden Sie das Skript zu veranschaulichen:

global.SynJS = global.SynJS || require('synjs'); 
var Sequelize = require('sequelize'); 

var db = new Sequelize('tracker', 'tracker', 'tracker123', { 
     host: 'localhost', 
     dialect: 'mysql', 
     pool: { 
     max: 5, 
     min: 0, 
     idle: 10000 
     }, 
    }); 

function insertWrapper(db,context,key,value) { // <- wrapper function that returns initially incomplete result 
    var res = {done: false}; 
    db.query("select CONCAT(?,'--->',?)", { replacements: [key,value], type: db.QueryTypes.SELECT }) 
    .spread(function(row) { 
     console.log('done: row=',row); 
     res.done = true; 
     SynJS.resume(context); // once result is ready, it notifies context of caller function to continue 
    }); 
    return res; 
} 

function myFunc(modules,db, country_json) { // <- function that is run via SynJS 
    for (var key in country_json) { 
     var res = modules.insertWrapper(db,_synjsContext,key,country_json[key]); 
     SynJS.wait(res.done); // <-- wait for the callback to finish 
    } 
}; 

var modules = { // <-- convenience object to pass whatever myFunc may need, as it cannot access closures 
     insertWrapper: insertWrapper, 
}; 

var country_json = { 
      "AF": "Afghanistan", 
      "AX": "\u00c5land Islands", 
      "AL": "Albania", 
      //........ 
      "ZW": "Zimbabwe" 
    }; 

// run myFunc via SynJS 
SynJS.run(myFunc,null,modules,db,country_json,function() { 
    db.close(); 
    console.log('done'); 
}); 

würde es folgende Ausgabe:

Executing (default): select CONCAT('AF','--->','Afghanistan') 
done: row= { 'CONCAT(\'AF\',\'--->\',\'Afghanistan\')': 'AF--->Afghanistan' } 
Executing (default): select CONCAT('AX','--->','Ã…land Islands') 
done: row= { 'CONCAT(\'AX\',\'--->\',\'Ã…land Islands\')': 'AX--->Ã…land Islands' } 
Executing (default): select CONCAT('AL','--->','Albania') 
done: row= { 'CONCAT(\'AL\',\'--->\',\'Albania\')': 'AL--->Albania' } 
Executing (default): select CONCAT('ZW','--->','Zimbabwe') 
done: row= { 'CONCAT(\'ZW\',\'--->\',\'Zimbabwe\')': 'ZW--->Zimbabwe' } 
done 
Verwandte Themen