sqlite3.OperationalError near '('语法错误 执行UPDATE语句报错如何解决
错误产生原因
- 核心SQL语法错误:
UPDATE语句的字段赋值语法书写错误,SQL规范中UPDATE语句给字段赋值需要使用=符号,你代码中写的SET timeofmute (?)不符合语法要求,是触发syntax error的直接原因。 - 方法使用逻辑错误:
executemany要求传入的参数为多组参数组成的序列,格式为[(参数1,), (参数2,), ...],每组参数对应一次SQL执行,你将所有计算后的值打包为单个元组传入,就算语法修正也无法实现预期逻辑。 - 业务逻辑漏洞:你的代码没有为
UPDATE语句加WHERE过滤条件,就算语法修正后执行,也会把表内所有行的timeofmute字段覆盖为同一个值,和你预期的「每行的timeofmute各自加60秒」的逻辑不符。
修复方案
最优方案(推荐)
你的需求是给表中所有行的timeofmute字段加60,不需要先查询再更新,直接用原生SQL语句即可实现,性能更高、没有并发问题,也不会出现语法错误:
@tasks.loop(seconds=60) async def mutething(): db = sqlite3.connect('mute.db') cursor = db.cursor() # 直接用SQL完成字段自增,不需要额外查询处理 cursor.execute("UPDATE mutes SET timeofmute = timeofmute + 60") # 写操作需要提交事务才会生效 db.commit() db.close()
若确实需要先查询再更新的场景修复
如果你的业务逻辑需要先取出数据做复杂计算再写回,需要搭配主键定位每行数据,示例如下:
@tasks.loop(seconds=60) async def mutething(): db = sqlite3.connect('mute.db') cursor = db.cursor() # 同时查询主键id和timeofmute cursor.execute("SELECT id, timeofmute FROM mutes") result = cursor.fetchall() # 构造参数:(新的timeofmute, 行id) update_params = [(row[1] + 60, row[0]) for row in result] # 带WHERE条件的UPDATE语句,用主键定位每行 cursor.executemany("UPDATE mutes SET timeofmute = ? WHERE id = ?", update_params) db.commit() db.close()
内容的提问来源于stack exchange,提问作者Not_GG_Gamer
相关产品推荐
相关产品推荐

