我正在寻找一些关于如何以最佳方式编写这段代码的见解。
我希望所有这些命令同步运行,因此我尝试使用 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/