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

使用awswrangler执行MySQL INSERT INTO UPSERT时数据未新增问题排查

问题原因分析
  1. SQL字符串拼接引发的参数解析错误:最初代码直接将CustomerID等值硬编码到SQL语句中,可能因字符串格式问题(比如未正确添加引号、特殊字符未转义)导致MySQL无法正确识别新的CustomerID,误判为重复键,触发ON DUPLICATE KEY UPDATE逻辑覆盖原有行。
  2. 错误更新主键/唯一键字段:原语句的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:55:12