我正在尝试使用nodejs和node-sqlite3包删除sqlite db中的一行。
当我运行delete命令并手动检查条目时,我可以看到查询成功删除了该行,但我似乎无法编写确认这一点的代码。
这就是查询
db.run("DELETE FROM Table1 WHERE id=? AND username=?", [id, user], function(error) {
console.log(error);
});无论输入是否正确,它都会将null输出到控制台。如果给出了正确的详细信息,它会将其删除并打印null,如果给出了错误的id和user,它仍然会打印null。
你知道哪里可能出问题了吗?
谢谢
发布于 2013-01-24 22:20:41
这里的node和node-sqlite3行为没有任何问题。这里有两个部分来解释,第一部分是关于node,另一部分是关于Sqlite。
Node
您的回调将在语句执行后调用。所以这里没什么问题,因为你的回调被调用了(正如'null‘作为输出所证明的)。
Sqlite
如果where子句中给定的条件计算为true,则删除查询语句中的Delete查询,否则不删除任何内容。
引用自node-sqlite3 documentation's Database#run api
回调(可选):如果指定,则在语句准备或执行过程中的任何步骤发生错误时以及查询运行后都会调用该回调函数。如果发生错误,第一个(也是唯一一个)参数将是包含错误消息的错误对象。如果执行成功,则第一个参数为null。
因此,在本例中,查询执行成功,没有任何错误,导致回调函数null的error参数,如您在输出中所见。
此外,如果要检查是否确实删除了任何行,可以使用文档中提到的changes属性:
如果执行成功,它将包含名为"lastID“和”
“的两个属性,这两个属性分别包含最后插入的行ID的值和受此查询影响的行数。请注意,"lastID“仅在查询是成功完成的INSERT语句时包含有效信息,而"changes”仅在查询是成功完成的UPDATE或DELETE语句时包含有效信息。在所有其他情况下,这些属性的内容都是不准确的,不应使用。.run()函数是设置这两个值的惟一查询方法;所有其他查询方法,如.all()或.get()都不检索这两个值。
希望这能帮上忙。
发布于 2016-03-03 23:28:09
对于我的prevoius问题,问题是我在回调声明中使用了胖箭头。从javascript文档中,我发现在箭头函数(胖箭头)中,这有词法作用域,所以这个结果没有定义,并且不像库文档中所说的那样有价值。使用其他无名函数,这在动态范围内是有界的,因此this.changes被赋值。
现在,使用如下代码,就可以了:
var sql = 'update recipes set stars = stars + 1 where id = ?';
db.run(sql,
[
1 // id = 1 execute update - if id = 11111 do nothing
], function(err) {
if(err)
throw err;
console.log("VALUE CHANGES: " + this.changes + " - " + util.inspect(this, { showHidden: false, depth: null }));
if(this.changes == 1)
console.log("WORK DONE");
else
console.log("NOTHING DONE");
});发布于 2013-06-20 04:39:50
我也遇到过类似的问题,回调就是不能触发。句号。问题是我在其他地方调用了process.exit(1),所以我的代码在回调函数有机会返回之前就退出了。
搜索process.exit,这可能(也可能不会)为您节省几个小时的调试和指责sqlite :)
离题:困扰我的是为什么他们都在lastID中使用大写ID。它不像是SQL或USA那样的缩写。它代表身份,这是一个单词。
https://stackoverflow.com/questions/10022984
复制相似问题