Python sqlite3使用带WHERE子句的UPDATE语句更新多行出现语法错误
问题原因
报错是因为你混用了Python f字符串语法和sqlite3参数化查询规则:你在SQL语句内部的WHERE子句写了WHERE f_name = f'{record_id}',Python解析f字符串时会把这部分替换为WHERE f_name = f'sam',但sqlite3不识别SQL语句里多出来的f前缀,因此触发语法错误。你手动写入'sam'时没有多余的f前缀,所以可以正常运行。
修复方案
不要用f字符串拼接任何SQL内容,所有动态值全部通过参数化字典传递,既避免语法错误,也能防范SQL注入风险,修改后的代码如下:
conn = sqlite3.connect("usersEsteso.db") c = conn.cursor() record_id = name # 完全使用参数化查询,WHERE条件也通过参数传递 c.execute("""UPDATE usersEsteso SET f_name = :first, P_iva = :P_iva, cell_number = :cell_number, tax = :tax, inps = :inps WHERE f_name = :record_id""", { "first": f_name_entry.get(), "P_iva": P_iva_entry.get(), "cell_number": cell_number_entry.get(), "tax": tax_entry.get(), "inps": inps_entry.get(), "record_id": record_id } ) conn.commit() conn.close()
注意事项
如果你一定要用f字符串拼接WHERE条件(极不推荐),可以去掉SQL内部的f前缀,写成WHERE f_name = '{record_id}',但这种写法如果record_id变量包含单引号会直接触发报错,还存在SQL注入风险,不建议使用。
内容的提问来源于stack exchange,提问作者Gianni Panni
相关产品推荐
相关产品推荐

