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
相关产品推荐
相关产品推荐

