用pyodbc.Cursor构造DataFrame设置列名报错:属性只读,求排查
问题原因及解决方法
你的错误出在直接将pyodbc.Cursor对象传入pd.DataFrame构造函数,这并没有实际提取查询结果,反而导致后续操作出现混淆。cursor本身不是可直接用于构造DataFrame的数据集,必须先提取cursor中的查询结果,再创建DataFrame。
错误分析
当执行neckinj_Table = pd.DataFrame(cursor)时,pandas并没有正确读取cursor中的数据行,反而可能在内部保留了对cursor对象的引用,导致后续设置columns时,误操作到了cursor的只读属性,从而抛出AttributeError。
修正后的代码
步骤1:提取cursor中的所有数据行
执行查询后,使用cursor.fetchall()获取所有结果:
cursor.execute(query) # 获取所有查询结果行 rows = cursor.fetchall()
步骤2:用结果行和列名构造DataFrame
你可以直接在构造DataFrame时指定columns参数,或者先创建DataFrame再设置列名:
# 方式1:构造时直接指定列名 neckinj_Table = pd.DataFrame(rows, columns=columnHeadings) # 方式2:先创建DataFrame再设置列名(两种方式都可行) neckinj_Table = pd.DataFrame(rows) neckinj_Table.columns = columnHeadings
完整修正代码
import pyodbc import pandas as pd conn = pyodbc.connect('Driver={SQL Server};' 'Server=BadgerServer;' 'Database=tracking;' 'Trusted_Connection=yes;') table_name = 'Badgers' cursor = conn.cursor() # 读取SQL查询文件 fd = open('Badgers_joined.sql', 'r') sqlFile = fd.read() fd.close() query_list = sqlFile.split(';') query = query_list[0] cursor.execute(query) # 获取列名 columnHeadings = [str(column[0]) for column in cursor.description] # 获取所有数据行 rows = cursor.fetchall() # 构造DataFrame并设置列名 neckinj_Table = pd.DataFrame(rows, columns=columnHeadings)
额外说明
- 若查询数据量极大,可使用
cursor.fetchmany(size)分批读取结果,避免一次性加载过多数据导致内存占用过高。 - 你之前提取列名的逻辑是正确的,无需修改。
内容的提问来源于stack exchange,提问作者acolls_badger
相关产品推荐
相关产品推荐

