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

