使用awswrangler执行MySQL INSERT INTO UPSERT时数据未新增问题排查
问题原因分析
- SQL字符串拼接引发的参数解析错误:最初代码直接将CustomerID等值硬编码到SQL语句中,可能因字符串格式问题(比如未正确添加引号、特殊字符未转义)导致MySQL无法正确识别新的CustomerID,误判为重复键,触发
ON DUPLICATE KEY UPDATE逻辑覆盖原有行。 - 错误更新主键/唯一键字段:原语句的
ON DUPLICATE KEY UPDATE中包含CustomerID=VALUES(CustomerID),而CustomerID作为主键或唯一约束字段,触发重复键逻辑时更新该字段,会将现有行的CustomerID替换为新值,表现为新数据覆盖旧行,而非新增。
关于wr.mysql.connect执行INSERT INTO查询的可行性
完全可以通过wr.mysql.connect实现UPSERT操作。wr.mysql.connect返回标准的MySQL数据库连接对象,和常规Python MySQL驱动(如MySQLdb)的连接用法一致,可创建游标并执行任意合法的MySQL INSERT语句(包括带ON DUPLICATE KEY UPDATE的UPSERT语句)。
修复步骤(已验证有效)
- 将SQL语句
VALUES子句的具体值替换为%s占位符,规避字符串拼接带来的解析错误和SQL注入风险:INSERT INTO customers (CustomerID, Name, Email) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE Name=VALUES(Name), Email=VALUES(Email) - 删除
ON DUPLICATE KEY UPDATE中的CustomerID=VALUES(CustomerID):主键/唯一键字段不应在重复键逻辑中被更新,否则会破坏UPSERT的预期逻辑(新增非重复行,更新重复行的其他字段)。 - 在
cursor.execute方法中传入参数元组,确保参数被正确解析:import awswrangler as wr with wr.mysql.connect("your_connection_name") as conn: with conn.cursor() as cursor: sql = """ INSERT INTO customers (CustomerID, Name, Email) VALUES (%s, %s, %s) ON DUPLICATE KEY UPDATE Name=VALUES(Name), Email=VALUES(Email) """ data = ("NEW_CUST_ID", "John Doe", "john@example.com") cursor.execute(sql, data) conn.commit()
内容的提问来源于stack exchange,提问作者GDC
相关产品推荐
相关产品推荐

