nodejs sqlite 3“SQLITE_MISUSE:数据库句柄已关闭”db.run 中的 db.all
Posted
技术标签:
【中文标题】nodejs sqlite 3“SQLITE_MISUSE:数据库句柄已关闭”db.run 中的 db.all【英文标题】:nodejs sqlite 3 "SQLITE_MISUSE: Database handle is closed" db.run within db.all 【发布时间】:2021-08-07 03:02:39 【问题描述】:所以我正在尝试以下方法:
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('MyDB.db');
console.log("Initializing...")
var MyGUID = "d49dfb07-7ac9-42e7-a355-2707209baea5";
db.serialize(function()
db.all("SELECT Name, Status FROM MyTable WHERE MyGUID = ? ", [MyGUID], function(err, rows)
console.log(rows);
db.run("UPDATE MyTable SET readOnly = 0 WHERE MyGUID = 'd49dfb07-7ac9-42e7-a355-2707209baea5'", "", function(err)
console.log(err);
);
);
);
db.close();
这会导致“SQLITE_MISUSE:数据库句柄已关闭” 显然我无法在 db.all 回调中运行 UPDATE 查询。但是为什么会这样呢?
【问题讨论】:
【参考方案1】:您应该将第二个查询作为db.serialize()
的参数。然后它将等待它完成,然后返回并允许db.close()
运行。
db.serialize(function()
db.all("SELECT Name, Status FROM MyTable WHERE MyGUID = ? ", [MyGUID], function(err, rows)
console.log(rows)
);
db.run("UPDATE MyTable SET readOnly = 0 WHERE MyGUID = 'd49dfb07-7ac9-42e7-a355-2707209baea5'", "", function(err)
console.log(err);
);
);
【讨论】:
谢谢,这行得通。但显然 db.run 在调用 db.all 的回调之前执行。那么如何确保 db.all 的回调在 db.run 执行之前完成。例如,如果我想检查我正在使用 db.all 获取的“名称”,并且只有在“名称”等于“约翰”时才创建 db.run。 你可以把db.close()
放在最后一个回调中。
谢谢。有时您看不到眼前的事物以上是关于nodejs sqlite 3“SQLITE_MISUSE:数据库句柄已关闭”db.run 中的 db.all的主要内容,如果未能解决你的问题,请参考以下文章
linux中 nodejs 安装 sqlite3 出现的问题