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

用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:35:36