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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 10:27:11