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

Python操作sqlite3执行UPDATE语句出现near "?"语法错误如何解决

错误原因
  • 核心问题是SQLite的参数占位符?仅支持传递数据值,不支持替换表名、字段名这类SQL标识符。你将表名通过?传递到UPDATE语句中,SQL解析器无法识别该语法,直接抛出near "?": syntax error报错。
  • 额外语法错误:你在修改后的执行语句中给?包裹了单引号'?',这会将占位符直接识别为普通字符串常量,彻底失去参数绑定的作用,同时破坏SQL结构。
  • 附加逻辑隐患:代码中if item is title的判断逻辑错误,is用于判断两个对象的内存地址是否一致,不是判断值相等,字符串值比较应该使用==,否则会出现预期外的判断失败。
修复方案
  1. 表名直接拼接进SQL语句,如果你传入的表名是外部可控的,需要提前做白名单校验避免SQL注入风险;如果是内部固定传递的表名,可直接拼接。
  2. 移除占位符外面的单引号,仅保留?作为值占位符,参数元组中不需要再包含表名。
  3. 修正值比较的逻辑判断。

修复后的参考代码:

def db_edit(db , cr , table , new_value , title):
    time = check_txt_len(new_value , 8 , "0")
    # 表名直接拼入SQL,参数仅保留值部分
    sql = f"UPDATE {table} SET title=? , hour=? , min=? , period=? where title=?"
    tu = (time, time[0:2], time[3:5], time[6:], title)
    cr.execute(sql, tu)
    db.commit()
    data = db_get("*" , "times" , "fetchall" , cr)
    for tu in data:
        for item in tu:
            # 修正比较逻辑为值比较
            if item == title:
                return False
    return True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:54:08