我正在尝试使用nodejs
和node-sqlite3
包在sqlite数据库中删除一行。
当我运行delete命令并手动检查条目时,我可以看到查询成功删除了该行,但我似乎无法编写确认此代码的代码。
这是查询
db.run("DELETE FROM Table1 WHERE id=? AND username=?", [id, user], function(error) {
console.log(error);
});
无论输入错误或正确,它都会向控制台输出null
。如果给出了正确的详细信息,它会删除它并打印null,如果给出了错误的id和user,它仍会打印为null。
关于可能出错的任何想法?
由于
答案 0 :(得分:4)
此处的节点和node-sqlite3行为没有任何问题。 以下是关于Sqlite的节点和其他方面的两个部分。
<强> Node
强>
执行语句后会调用您的回调。所以没有错,因为你的回调被调用(由'null'作为输出证明)。
Sqlite
如果where
子句中给出的条件的计算结果为true,则删除Sqlite中的查询删除,否则不删除任何内容。
参考node-sqlite3 documentation's Database#run api:
回调(可选):如果给定,则在发生错误时调用它 在声明准备或执行的任何步骤期间,以及之后 查询已运行。如果发生错误,则第一个(仅限) 参数将是包含错误消息的错误对象。如果 执行成功,第一个参数为null。
因此,在您的情况下,查询执行成功没有任何错误,导致回调函数error
的{{1}}参数,如输出中所示。
此外,如果要检查是否实际删除了任何行,可以使用文档中提到的null
属性:
如果执行成功,它包含两个名为“lastID”的属性 和“更改”,其中包含最后插入的行ID和的值 分别受此查询影响的行数。注意 “lastID”仅在查询为a时包含有效信息 成功完成INSERT语句并且“更改”仅包含 查询成功完成更新时的有效信息 或DELETE语句。在所有其他情况下,这些内容 属性不准确,不应使用。 .run()函数 是唯一设置这两个值的查询方法;所有其他查询 诸如.all()或.get()之类的方法不会检索这些值。
希望它有所帮助...
答案 1 :(得分:2)
我有类似的问题,回调就是不会开火。期。问题是我在其他地方调用了process.exit(1),所以我的代码在回调有机会返回之前就退出了。
搜索process.exit,可能(或可能不会)为您节省数小时的调试和指责sqlite:)
关闭主题:我的想法是什么,为什么他们在lastID中全部限制ID。它不像是SQL或美国这样的缩写。它代表身份证明,这是一个词。
答案 2 :(得分:1)
我对nodejs 4.3和sqlite3:3.1.1。
有一些问题问题在于,当更新对任何行没有影响时更新对一行有效时我想分开(不先执行select)。
在我的示例中,我有一个id = 1的行。我想知道当我使用id = 1111进行更新时,没有任何行受到影响。
我在database.run上使用了回调,但是当在数据库中的某行上执行更新时,似乎没有对 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
], (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");
});
this.changes是未定义的,即使正确执行更新(当我使用id时也是如此,例如1111111,而不是在数据库中)。
有错误或者我不了解如何使用回调?
控制台上的结果是: VALUE CHANGES:undefined - {db:Database {open:true,filename:&#39; ./ dindin.sqlite&#39;,mode:65542}}
如果id = 1则相同并在一行上执行update或id = 1111111并在无行上执行update。
答案 3 :(得分:1)
对于我的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");
});