Python遍历查询结果更新SQL Server表出现数据类型报错如何解决?
问题排查与修复方案
核心问题定位
你遇到的两个核心问题分别对应遍历失效和数据类型报错:
- 结果集仅能遍历一次:如果
results是数据库查询返回的游标迭代对象,第一次遍历打印row[0]后,游标已经移动到结果集末尾,第二次遍历for row in results时没有剩余数据可处理,这是只有第一行能正常执行的直接原因。 - SQL参数类型不匹配:你给UPDATE语句的第二个参数传的是
bill,而bill = row,row是结果集返回的元组对象,不是FullPath字段需要的路径字符串。ODBC驱动无法将元组转换为SQL支持的字符串类型,就会抛出Invalid SQL data type报错。 - 额外冗余问题:你把数据库连接创建、关闭的逻辑写在了循环内部,每次循环都会重复创建销毁连接,会产生不必要的性能损耗。
修复步骤
- 执行查询后先把结果集转为列表固化内容,避免遍历一次就失效:
results = list(results) - 给SQL的WHERE条件传入路径字符串
row[0],不要传入整个row元组 - 将数据库连接、游标创建逻辑移到循环外层,避免重复创建连接
- 读文件时指定编码,避免不同系统环境下的文件读取编码报错
修复后代码示例
import pyodbc # 固化结果集,支持多次遍历 results = list(results) # 提前打印所有路径确认 for row in results: print(row[0]) # 全局创建一次数据库连接和游标,无需循环内重复创建 cnxn1 = pyodbc.connect('Driver={SQL Server};' 'Server=XXX;' 'Database=00010KData;' 'Trusted_Connection=yes;') curs1 = cnxn1.cursor() for row in results: file_path = row[0] # 读文件时指定编码,可根据你的文件实际编码调整为gbk等 with open(file_path,'r', encoding='utf-8', errors='ignore') as f: contents = f.read() VanHalen = 'Hello' # 第二个参数传路径字符串,而非整个row元组 curs1.execute(''' Update EdgarComments SET Comments7 = ? WHERE FullPath = ? ''', (VanHalen, file_path)) print(f"已更新路径:{file_path}") # 统一提交事务、关闭资源 cnxn1.commit() curs1.close() cnxn1.close()
如果你的业务逻辑要求每个路径要执行3次更新操作,只需要把对应的for x in range(0,3)逻辑嵌套在每个文件的处理逻辑内部即可,不要将数据库连接的创建逻辑放到循环里。
内容的提问来源于stack exchange,提问作者TenkMan
相关产品推荐
相关产品推荐

