使用nodejs和sqlite获取BUSY错误

我正在寻找一些有关如何写这段代码的最好方法的见解。

我想要所有这些命令运行同步,所以我想使用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.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已经closures了。接下来我试着在查询的callback中移动db.serialize,然后在callback中pipe理closures数据库。 这似乎不是最好的解决scheme(我偶尔DB是忙于其他事件)。 我正在寻找正确的方法来做到这一点。

谢谢你的帮助

 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,那么这是处理closures数据库的最好方法。

蓝鸟承诺有一个.finally选项,你可以把db.close(),它会运行后,所有的数据库调用的承诺履行。

重构到下面。 另一个给我的问题是db.all。 我重构后,db.all没有看到插入。 更改db.each修复了那个部分:

 db.serialize(function() { db.run("DELETE FROM image_status"); var stmt = db.prepare("INSERT INTO image_status ( restart_new , next_type , next_new_id, next_old_id ) " +"VALUES (?,'old'," + "(SELECT image_id FROM image WHERE file_downloaded = 1 ORDER BY image_id DESC LIMIT 1)," + "(SELECT image_id FROM image WHERE file_downloaded = 1 ORDER BY image_id ASC LIMIT 1))" ); stmt.run(restart_new); stmt.finalize(); db.each("SELECT next_new_id, next_old_id FROM image_status LIMIT 1", function(err, row) { if (err) { logger.error('connection %j', err); throw err; } mycallback(row.next_new_id, row.next_old_id,'old'); }); }); db.close();