最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

sqlite3的db.close()调用之前db.serialized()完成

运维笔记admin9浏览0评论

sqlite3的db.close()调用之前db.serialized()完成

sqlite3的db.close()调用之前db.serialized()完成

我有一个sqlite3的嵌套查询情况。希望每个查询结果推到一个JSON数组,然后返回。但是,总是得到“错误:SQLITE_MISUSE:数据库关闭句柄”的第2选择调用。看来db.close()第二个查询之前被调用。

这是为什么,我以为可以连载利用这一照顾。如何修复它吗?

var getMyDbInfo = function(callback) {
    var db = new sqlite3.Database("MyDB.sqlite3");

    db.serialize(function() {

        var myJsonObj = {};

        db.each("select * from Table1",
            function(err, row) {
                console.log("\n---- 0 ----\n");
                // calculate doorId from row
                doorId = ...

                db.all("select * from Table2 where ID=" + doorId,
                       function(err, row2) {
                           console.log("---- 6 ----\n");
                           if(err) {
                               console.log("-- ERR: " + err);
                           } else {
                               console.log(row2);
                               var myJsonElem = {ID:row.ID,
                                   DoorName: row2.DoorName,
                                   TimeSpec: row2.TimeSpec };

                               myJsonObj.data.push(myJsonElem);
                           }
                       }
               );
            }
        );
        callback(null, myJsonObj);
    });

    console.log("---- 10 ----\n");
    db.close();

};
回答如下:

db.all()调用嵌套在db.each()的回调函数。 Per the docs,db.serialize()只序列直接在db.serialize()回调函数的调用。至于db.serialize()而言,因为没有更多的联调用进行,所以执行db.each()它的任务是尽快为db.close()调用回调完成。

这里的一个解决方案 - 摆脱db.serialize()的,因为你只里面调用db.each(),并使用第二个“completion”回调函数db.each() db.close()已通过所有行运行后调用db.each()

如果需要让更多的DB db.each()调用后,添加db.serialize()db.each()完成回调中,并从那里继续。

var getMyDbInfo = function(callback) {
    var db = new sqlite3.Database("MyDB.sqlite3");

    var myJsonObj = {};

    db.each("select * from Table1",
        function(err, row) {
            console.log("\n---- 0 ----\n");
            // calculate doorId from row
            doorId = ...

            db.all("select * from Table2 where ID=" + doorId,
                    function(err, row2) {
                        console.log("---- 6 ----\n");
                        if(err) {
                            console.log("-- ERR: " + err);
                        } else {
                            console.log(row2);
                            var myJsonElem = {ID:row.ID,
                                DoorName: row2.DoorName,
                                TimeSpec: row2.TimeSpec };

                            myJsonObj.data.push(myJsonElem);
                        }
                    }
            );
        },
        function (err, rows) {
            callback(null, myJsonObj);
            db.close();
            console.log("---- 10 ----\n");
        }
    );

};
发布评论

评论列表(0)

  1. 暂无评论