使用SQLite3包的Node.js脚本中的查询顺序错误
我在玩游戏,遇到了一个奇怪的情况。 这个简单的脚本有一个简单的逻辑:查找表是否存在,是否清空,如果不存在-创建它使用SQLite3包的Node.js脚本中的查询顺序错误,node.js,sqlite,package,Node.js,Sqlite,Package,我在玩游戏,遇到了一个奇怪的情况。 这个简单的脚本有一个简单的逻辑:查找表是否存在,是否清空,如果不存在-创建它 var sqlite3 = require('sqlite3').verbose(); var db = new sqlite3.Database('guy.sqlite'); //':memory:' var tableExists = false; db.serialize(function() { db.get("SELECT name FROM sqlite_
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('guy.sqlite'); //':memory:'
var tableExists = false;
db.serialize(function() {
db.get("SELECT name FROM sqlite_master WHERE type='table' AND name='lorem'", function(error, row) {
tableExists = (row != undefined);
console.log("xxxxx " +tableExists);
});
console.log("yyyyy " +tableExists);
if (tableExists) {
console.log("table exists. cleaning existing records");
db.run("DELETE FROM lorem", function(error) {
if (error)
console.log(error);
});
}
else {
console.log("creating table")
db.run("CREATE TABLE lorem (info TEXT)", function(error) {
if (error.message.indexOf("already exists") != -1) {
console.log(error);
}
});
}
});
db.close();
但我得到的结果是:
yyyyy false
creating table
xxxxx true
{ stack: [Getter/Setter],
arguments: undefined,
type: undefined,
message: 'SQLITE_ERROR: table lorem already exists',
errno: 1,
code: 'SQLITE_ERROR' }
根据,这些查询应该按顺序运行。但显然,tableExists
(标记为'yyy')的计算发生在设置值(标记为'xxx')之前,导致尝试重新创建现有表。我可以处理这个错误,但我想知道是什么导致了这个错误,以及如何在将来避免这种行为 一如既往,谢谢你抽出时间
Guynode.js在异步模式下工作,但您的代码是某种混合了同步和异步形式的奇怪形式 select之后的完整代码应该在回调中,而您的实际代码不符合您的要求,tableexists将不具有您喜欢的值
学习node.js的异步模型;) 文档中的示例2直接解释了您的问题。tableExists变量在第一次运行时将为false,而SELECT函数仅在事件循环上排队,并且在serialize()中的代码完成之前不会运行。解决方案是将
if(tableExists)
code放在回调中进行选择。这违背了使用serialize的目的,但它就是这样工作的。写入值很好,因为它们将按照调用顺序排队,但是需要通过I/O响应的东西将需要回调,从而异步运行
另外,
SQLITE\u误用
错误源于在脚本末尾调用db.close(),但在异步回调之外。即使是在剧本的结尾,在当前函数完成后,才会调用的队列中放入的任何异步内容。为什么删除/创建表的代码不在检查表是否存在的回调中?尝试了该操作后,出现以下错误:“SQLITE\u误用:数据库句柄已关闭”将条件移动到SELECT中函数并注释了db.close()-现在它可以工作了。但是,如果我真的需要db.close()语句,我应该把它放在哪里,以便它能够按照所需的顺序执行呢?在.serialize()函数中进行了尝试,并得到了误用错误。基本上,在所有异步命令完成之后。但是,如果您需要脚本做的不仅仅是一个简单的创建表
,那么这就是困难的部分。首先,理解异步编程和连续性是一个学习过程,也是新手经常遇到的问题之一。有很多库试图简化这个过程。看看一本好书就是