【问题标题】:sqlite3 db.close() called before db.serialized() finishessqlite3 db.close() 在 db.serialized() 完成之前调用
【发布时间】:2019-02-10 07:06:54
【问题描述】:

我有一个 sqlite3 嵌套查询案例。希望将每个查询结果推送到 json 数组并将其返回。 但是对于第二次选择调用,总是得到“错误:SQLITE_MISUSE:数据库句柄已关闭”。 似乎 db.close() 在第二个查询之前被调用。

为什么会这样,我认为 serialize 可以解决这个问题。请问怎么解决?

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

};

【问题讨论】:

    标签: node.js node-sqlite3


    【解决方案1】:

    db.all() 调用嵌套db.each() 的回调函数中。 Per the docsdb.serialize() 仅序列化直接在 db.serialize() 回调函数中进行的调用。就db.serialize() 而言,只要调用db.each() 的回调,它的工作就完成了,因为没有更多的内联调用要进行,所以db.close() 被执行。

    这里的解决方案 - 摆脱 db.serialize(),因为您只在其中调用 db.each(),并为 db.each() 使用第二个“completion”回调函数,在 db.each() 之后调用 db.close()遍历所有行。

    如果需要在db.each() 之后进行更多的数据库调用,请在db.each() 完成回调中添加一个db.serialize() ,然后从那里继续。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多