node.js - 使用 nodejs 和 sqlite 出现 BUSY 错误

标签 node.js sqlite

我正在寻找一些关于如何以最佳方式编写这段代码的见解。

我希望所有这些命令同步运行,因此我尝试使用 db.serialize 函数。

我需要根据查询结果执行一些其他数据库操作(顺便说一句,我仍然是 Node 新手)

我第一次尝试这个

var db = new sqlite3.Database(file);
var stmt = "SELECT image_id FROM image WHERE file_downloaded = 1 ORDER BY image_id DESC LIMIT 1";
db.serialize(function() {
    db.all(stmt, function(err, rows) {
        if (err){
            if (err) { logger.error('Error %j',  err); throw err; }
        }
        if ( rows.length > 0 ){
                db.run("DELETE FROM image_status");
                db.run("INSERT INTO image_status ( next_new_id, next_type , restart_new  ) VALUES ("+rows[0].image_id+",'old',"+restart_new+")");
                db.run("UPDATE image_status SET next_old_id = (SELECT image_id FROM image WHERE file_downloaded = 1 ORDER BY image_id ASC LIMIT 1)");
                db.all("SELECT next_old_id FROM image_status LIMIT 1", function(err, rows) {
                    if (err) { logger.error('connection %j',  err); throw err; }
                    if ( rows.length > 0 ){
                        next_old_id = rows[0].next_old_id;
                    }
                    mycallback(next_new_id, next_old_id,'old');
                })
        }
    })
});
db.close();

但是当然,当我到达 DELETE 部分时,数据库已经关闭 因此,接下来我尝试将 db.serialize 移动到查询回调中,然后在回调中管理关闭数据库。这似乎不是最好的解决方案(我偶尔会发现数据库因其他事件而繁忙)。我正在寻找正确的方法来做到这一点。

感谢您的帮助

var db = new sqlite3.Database(file);
var stmt = "SELECT image_id FROM image WHERE file_downloaded = 1 ORDER BY image_id DESC LIMIT 1";
db.all(stmt, function(err, rows) {
    if (err){
        db.close();
        if (err) { logger.error('Error %j',  err); throw err; }
    }
    if ( rows.length > 0 ){
        db.serialize(function() {
            db.run("DELETE FROM image_status");
            db.run("INSERT INTO image_status ( next_new_id, next_type , restart_new  ) VALUES ("+rows[0].image_id+",'old',"+restart_new+")");
            db.run("UPDATE image_status SET next_old_id = (SELECT image_id FROM image WHERE file_downloaded = 1 ORDER BY image_id ASC LIMIT 1)");
            db.all("SELECT next_old_id FROM image_status LIMIT 1", function(err, rows) {
                if (err) { logger.error('connection %j',  err); throw err; }
                if ( rows.length > 0 ){
                    next_old_id = rows[0].next_old_id;
                }
                mycallback(next_new_id, next_old_id,'old');
            })
            db.close();
        });
    }else{
        db.close();
    }
})

最佳答案

如果您不打算实现 promise ,那么这是处理关闭数据库的最佳方法。

Bluebird Promise 有一个 .finally 选项,您可以在其中放置 db.close(),它将在所有数据库调用 Promise 完成后运行。

关于node.js - 使用 nodejs 和 sqlite 出现 BUSY 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34210830/

相关文章:

javascript - Node/Express 解析 7000 个 xml 文档时发生 fatal error

java - 游标未从 sqlite 数据库检索数据

objective-c - sqlite3_prepare_v2 exc_bad_access

c# - 正确包含 x32 或 x64 System.Data.SQLite.dll 文件

用于 node.js 的 mysql 框架

javascript - NodeJS MongoDB 游标 toArray 回调函数不会对父范围变量进行更改

node.js - 使用中间件自动将变量传递到 View 中

json - ExpressJs res.json : Can't set headers after they are sent

ios - 使用 FMDB 根据日期进行查询过滤?

java - 优化sqlite应用程序启动