SQLite参数绑定因嵌套查询而失败

whhtz7ly  于 2023-06-06  发布在  SQLite
关注(0)|答案(1)|浏览(528)

我有以下疑问

DELETE FROM Item WHERE rowid IN (
  SELECT rowid FROM ItemFts WHERE path = :path
)

其中ItemFts是FTS 5表,它使用Item表作为其外部内容。我的观察结果是查询执行了,但记录没有被删除。我已经确认以下两个查询都可以单独工作:
这将返回正确的rowid(例如1):

SELECT rowid FROM Item WHERE path = :path

这将正确删除rowid = 1处的记录:

DELETE FROM Item WHERE rowid IN (1)

我的问题发生在嵌套两个查询时。对于其他上下文,我使用SQLite的wasm OO API中的exec方法。所以绑定看起来是这样的

db.exec(`
DELETE FROM Item WHERE rowid IN (
  SELECT rowid FROM ItemFts WHERE path = :path
)
`, {bind: {":path": "some/path"}})

我的主要问题是,我不能告诉如果问题是在我的代码或它的问题与wasm库。SQLiteMaven可以帮助我吗?谢谢你!
更新
硬编码路径也可以工作,因此问题最有可能是在绑定中。

DELETE FROM Item WHERE rowid IN (
  SELECT rowid FROM ItemFts WHERE path = 'some/hard/coded/path'
)

更新2
为遇到相同问题的任何人提供的解决方法

db.transaction(() => {
  const rowids = db.selectValues("SELECT rowid FROM ItemFts WHERE path = :path", {
    ":path": path,
  });

  db.exec(`DELETE FROM Item WHERE rowid IN (${rowids.join(",")})`);
});
cnjp1d6j

cnjp1d6j1#

我刚刚发现这个问题是由于我不小心使用了API。我用这个:

db.exec(`...`, {":path": path})

而不是这样:

db.exec(`...`, { bind: {":path": path} })

显然,我把db.execdb.selectObjects搞混了,后者的参数绑定签名更浅。

相关问题