You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron+Node.js环境下SQLite UPDATE FROM语句执行报错问题求助

问题原因

嘿,这个问题其实是SQLite的UPDATE语法和你在DataGrip里用的数据库(比如PostgreSQL/MySQL)不一样导致的!你写的UPDATE ... FROM是很多主流关系型数据库支持的语法,但SQLite并不认可这种写法,它有自己专属的UPDATE JOIN规则,所以才会抛出near "FROM": syntax error的错误。

解决办法

把你的SQL语句改成SQLite支持的格式就行,这里有两种靠谱的写法:

写法1:使用UPDATE结合子查询(WHERE EXISTS)

这种写法逻辑和你原来的一致,只是适配了SQLite的语法:

UPDATE StorageProducts
SET quantity = StorageProducts.quantity - (innerquery.q2 * innerquery.c)
WHERE EXISTS (
    SELECT 1
    FROM (
        SELECT SP.product_name, RP.quantity AS q2, PHS.consumes AS c
        FROM StorageProducts SP
        INNER JOIN ProductHasStorage PHS ON SP.product_name = PHS.storage_name
        INNER JOIN ReceiptProduct RP ON PHS.product_name = RP.product_name
        WHERE receipt_id = ?
    ) AS innerquery
    WHERE StorageProducts.product_name = innerquery.product_name
)

写法2:直接在UPDATE中使用JOIN(更简洁高效)

SQLite支持在UPDATE语句里直接关联表,这种写法比子查询更高效:

UPDATE StorageProducts
SET quantity = StorageProducts.quantity - (RP.quantity * PHS.consumes)
INNER JOIN ProductHasStorage PHS ON StorageProducts.product_name = PHS.storage_name
INNER JOIN ReceiptProduct RP ON PHS.product_name = RP.product_name
WHERE RP.receipt_id = ?

额外提示

我把你原来的硬编码receipt_id = 1改成了占位符?,和你代码里的[2]参数绑定对应,这样既符合参数化查询的最佳实践,还能避免SQL注入风险。

把上面任意一种语句替换到你的db.run()调用里,应该就能正常执行更新操作啦!

内容的提问来源于stack exchange,提问作者Mohammad Hossam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 05:17:41