You need to enable JavaScript to run this app. Ubuntu下使用pandas iterrows经ODBC驱动插SQL Server出现插入行数超预期问题
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下使用pandas iterrows经ODBC驱动插SQL Server出现插入行数超预期问题

异常原因定位与排查方案

代码硬错误触发驱动重复请求

当前插入SQL存在明确的参数匹配问题:

  • 插入目标列仅声明3个字段:Sno,A,B
  • 但VALUES占位符写了4个:values(?,?,?,),同时传入的参数值只有3个(row.Sno, row.A, row.B)
    Linux环境下的SQL Server ODBC驱动遇到这类参数与占位符数量不匹配的场景时,不会直接抛出终止程序的硬错误,反而会在驱动内部触发参数校验重试、请求重发逻辑,将单条INSERT请求向服务端发送多次,直接导致插入行数超出DataFrame的实际行数。
    此外占位符末尾多余的逗号(?,?,?,))属于SQL语法错误,会进一步触发驱动的异常重试分支。

脚本重复执行未做存量校验

单次执行插入逻辑仅会写入3497行,累计3万行左右的插入量,刚好对应重复执行9~10次同一段插入代码的规模。这类场景包含:

  • 调试过程中修改代码片段后反复运行脚本,插入前未清空目标表,也没有对Sno字段设置唯一主键约束拦截重复数据
  • 脚本因网络异常中途中断后,未回滚未提交事务就直接重跑,之前已成功写入但未触发最终commit的批次,会和重跑后的写入数据累计到同一张表
  • 插入执行前未查询目标表基线行数,跑完后直接查全表总行数,把历史遗留的存量数据误判为本次新插入的数据

驱动层无感知请求重发

如果修正上述SQL语法错误后仍出现插入行数超预期的问题,基本是Linux ODBC驱动的网络重连机制导致:

  • 大批量插入过程中如果出现网络瞬断,驱动收不到SQL Server的成功响应回执,会自动重新发送之前未确认的INSERT请求,不会校验目标表中是否已存在对应数据
  • 连接的自动提交配置和手动commit逻辑冲突,导致同一批请求被重复提交两次

排查验证步骤

  • 先修正SQL的占位符错误,删掉多余的问号和末尾逗号,确保占位符数量、传入参数数量、插入列数量三者完全一致
  • 插入执行前先查询SELECT COUNT(*) FROM tbl_A,记录当前行数基线,单次执行脚本后再次查询行数,对比增量是否和df.shape[0]完全相等,不要直接用全表总行数判断插入量
  • 排查阶段可临时把cnxn.commit()移到循环内部,每插入一行就提交一次,逐行核对表的行数增量,定位是否存在单条请求被驱动重复发送的问题
  • 给tbl_A的Sno字段加唯一主键约束,从服务端层面拦截重复插入的无效数据

内容的提问来源于stack exchange,提问作者vinsent paramanantham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 14:45:02