Python执行MySQL INSERT ON DUPLICATE KEY语句报语法错误求助
错误原因
你的SQL语法错误出在ON DUPLICATE KEY UPDATE子句的VALUES()函数使用不符合MySQL规范:
VALUES()括号内必须填写表的列名,不能传参数占位符。你写的VALUES(%s)会被Python的数据库驱动替换为传入的IP字符串,MySQL解析时遇到引号包裹的字符串值作为VALUES()的参数,就会抛出语法错误,和你看到的报错指向单引号包裹内容的现象完全吻合。- 逻辑上如果
IPAddress是表的主键/唯一索引(这是ON DUPLICATE KEY UPDATE生效的前提),触发重复键冲突时IPAddress本身就是冲突的键值,不需要重复更新这个字段,你实际需要更新的是UnBlock字段。
修正后的代码
直接把执行语句替换为以下内容即可,不需要重复传入IP参数给UPDATE子句:
# 注意:请提前确认IPAddress字段已设置为主键或唯一索引,否则ON DUPLICATE KEY UPDATE逻辑不会触发 cursor.execute( "INSERT INTO blocked_ip (IPAddress, UnBlock) VALUES (%s, %s) ON DUPLICATE KEY UPDATE UnBlock = VALUES(UnBlock)", (i, '1') )
修正后的逻辑:
- 传入的IP不存在时,直接插入新记录,写入IP地址和UnBlock状态
- 传入的IP已存在时,自动将对应记录的UnBlock字段更新为本次传入的'1',不会改动其他字段,也不会重复插入数据。
额外优化建议
如果要进一步贴合你“不删全量、仅更新变动数据”的优化目标,可以先查询出当前表中所有已存在的IP和UnBlock状态,和你最新拉取的数据集做差集比对,只针对新增IP、状态有变动的IP执行写入操作,比全量循环执行upsert语句性能更高。
内容的提问来源于stack exchange,提问作者wtm
相关产品推荐
相关产品推荐

