4

我正在尝试使用nodejsnode-sqlite3包执行删除 sqlite db 中的一行。

当我运行删除命令并手动检查条目时,我可以看到查询成功删除了该行,但我似乎无法编写确认这一点的代码。

这是查询

db.run("DELETE FROM Table1 WHERE id=? AND username=?", [id, user], function(error) {
console.log(error);
});

无论输入错误或正确,它都会输出null到控制台。如果给出了正确的详细信息,它将删除它并打印 null,如果给出了错误的 id 和用户,它仍然打印 null。

关于什么可能是错的任何想法?

谢谢

4

3 回答 3

4

这里的 node 和 node-sqlite3 行为没有任何问题。这里有两个部分首先解释节点和其他关于 Sqlite 的部分。

Node

您的回调在执行语句后被调用。所以这里没有错,因为你的回调被调用了(正如'null'作为输出所证明的那样)。

Sqlite

如果子句中给出的条件评估为真,则 Sqlite 中的删除查询将删除where,否则不会删除任何内容。

参考node-sqlite3 文档的 Database#run api

回调(可选):如果给定,它将在语句准备或执行的任何步骤发生错误时以及在运行查询之后调用。如果发生错误,第一个(也是唯一的)参数将是包含错误消息的错误对象。如果执行成功,第一个参数为空。

因此,在您的情况下,查询执行成功,没有任何错误,导致error回调函数的参数,null如您在输出中看到的那样。

此外,如果要检查是否实际删除了任何行,可以使用changes文档中提到的属性:

如果执行成功,它包含两个名为“lastID”和“changes”的属性,分别包含最后插入的行 ID 的值和受此查询影响的行数。请注意,“lastID”仅在查询是成功完成的 INSERT 语句时包含有效信息,而“changes”仅在查询是成功完成的 UPDATE 或 DELETE 语句时包含有效信息。在所有其他情况下,这些属性的内容是不准确的,不应使用。.run() 函数是设置这两个值的唯一查询方法;所有其他查询方法,例如 .all() 或 .get() 都不会检索这些值。

希望能帮助到你...

于 2013-01-24T14:20:40.573 回答
4

对于我之前的问题,问题是我使用胖箭头进行回调声明。从 javascript 文档中,我发现在箭头函数(胖箭头)中,this具有词法范围,因此该结果未定义,并且不像库文档中所说的那样被重视。使用其他匿名函数, this 在动态范围内有界,因此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");

    });

这里有更多解释:https ://github.com/mapbox/node-sqlite3/issues/606

于 2016-03-03T15:28:09.393 回答
3

我有类似的问题,回调只是不会触发。时期。问题是我在其他地方调用了 process.exit(1),所以我的代码在回调有机会返回之前就退出了。

搜索 process.exit,这可能(或可能不会)为您节省数小时的调试和责备 sqlite :)

题外话:让我心烦意乱的是为什么他们在 lastID 中全大写 ID。它不像 SQL 或 USA 那样的缩写。它代表识别,这是一个词。

于 2013-06-19T20:39:50.073 回答