【问题标题】:synchronous loop for insertion of datavalue in SQLite用于在 SQLite 中插入数据值的同步循环
【发布时间】:2017-05-31 15:31:03
【问题描述】:

我正在使用sequelezer 将值插入本地数据库。这是一种需要在服务器上第一次运行的设置脚本。

由于 nodejs “异步”函数调用,我的 sqlite db 被锁定,我收到以下错误 Unhandled rejection SequelizeTimeoutError: SQLITE_BUSY: database is locked

这是我的代码

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

    }

我尝试了几个同步 npm 模块,但每个模块似乎都在工作。只是想知道如何在 node js 中处理这些场景。

【问题讨论】:

    标签: node.js sqlite synchronization sequelize.js


    【解决方案1】:

    您可以使用 SynJS 将异步函数与循环、逻辑、递归等混合使用 - 它会以同步方式一个接一个地执行所有步骤。下面是说明的脚本:

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

    它将产生以下输出:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 2012-01-31
      • 2012-09-09
      相关资源
      最近更新 更多