pyodbc执行UPDATE语句未更新表问题排查求助
问题排查与调试方案
让我帮你一步步拆解这个问题——你的代码里藏着几个关键问题,而且因为错误被悄悄掩盖了,所以你看不到UPDATE失败的真正原因:
1. 先移除try except pass,让错误“现身”
你当前的try: ... except: pass会把所有错误(比如SQL语法错、变量不存在)全部吞掉,这是最致命的!先把它改成能打印异常的形式:
try: # 你的业务代码 except Exception as e: print(f"处理出错:{e}")
这样你立刻就能看到为什么UPDATE没执行——大概率是语法错误或者变量找不到的问题。
2. 第一个查询漏了关键字段UniqueProjectNumber
你的初始查询是:
Select Account_Name FROM dsf_CS_WebAppView
但后面代码里却用了row.UniqueProjectNumber,这个字段根本不在查询结果里!这会直接抛出AttributeError,但被except pass掩盖了,导致UPDATE语句根本没机会执行。赶紧修改第一个查询:
Select Account_Name, UniqueProjectNumber FROM dsf_CS_WebAppView
3. SQL字符串拼接没加引号,导致语法错误
你用format拼接UPDATE语句时,字符串类型的参数(比如Account_Name、fullpath)没有加单引号,生成的SQL会变成这样:
UPDATE customerdesignmap SET householdname = MyAccount, msid = 123 WHERE fullpath LIKE /some/path
SQL会把MyAccount当成列名,直接报错。永远不要用字符串拼接生成SQL,改用参数化查询,它会自动处理引号和类型转换,还能避免SQL注入:
cursor.execute( "UPDATE customerdesignmap SET householdname = %s, msid = %s WHERE fullpath = %s", (row.Account_Name, row.UniqueProjectNumber, rowb.fullpath) )
注意:不同数据库占位符可能不同,MySQL用%s,SQL Server用?,根据你的数据库调整即可。
4. 重复调用cursor.fetchall()导致结果集空值
你代码里有一行:
print(len(cursor.fetchall()))
但之前已经用rows = cursor.fetchall()取完了结果集,第二次调用cursor.fetchall()会返回空列表,这行代码完全多余,建议删掉。
针对性调试技巧
- 打印待执行的SQL:在执行UPDATE前,先把SQL和参数打印出来,复制到SQL工作台执行,验证语法是否正确:
update_sql = "UPDATE customerdesignmap SET householdname = %s, msid = %s WHERE fullpath = %s" update_params = (row.Account_Name, row.UniqueProjectNumber, rowb.fullpath) print(f"要执行的SQL:{update_sql},参数:{update_params}") cursor.execute(update_sql, update_params) - 检查受影响行数:执行UPDATE后,用
cursor.rowcount查看实际更新了多少行,确认是否有数据被修改:cursor.execute(update_sql, update_params) print(f"本次更新了{cursor.rowcount}行数据") conn.commit() - 确认事务提交:虽然你调用了
conn.commit(),但如果执行过程中报错,commit可能不会触发。可以把commit放在循环外(数据量大时需注意锁的问题),或者确保只有在无错误时才提交。
修正后的代码示例
cursor = conn.cursor() # 修正初始查询,添加必要字段 cursor.execute("Select Account_Name, UniqueProjectNumber FROM dsf_CS_WebAppView") for row in cursor.fetchall(): try: # 参数化查询替代字符串拼接 cursor.execute( "Select fullpath FROM customerdesignmap WHERE fullpath LIKE %s", (f'%{row.Account_Name}%',) ) rows = cursor.fetchall() print(f"为账号{row.Account_Name}找到{len(rows)}条匹配记录") if len(rows) > 0: for rowb in rows: # 兼容元组或对象类型的查询结果 fullpath = rowb[0] if isinstance(rowb, tuple) else rowb.fullpath print(f"匹配路径:{fullpath},账号名:{row.Account_Name}") if len(row.Account_Name) > 2: update_sql = """ UPDATE customerdesignmap SET householdname = %s, msid = %s WHERE fullpath = %s """ update_params = (row.Account_Name, row.UniqueProjectNumber, fullpath) cursor.execute(update_sql, update_params) print(f"路径{fullpath}下更新了{cursor.rowcount}行") conn.commit() except Exception as e: print(f"处理账号{row.Account_Name}时出错:{str(e)}") conn.rollback()
内容的提问来源于stack exchange,提问作者Rayen Kamta
相关产品推荐
相关产品推荐

