使用Pandas+PyODBC查询TopSpeed数据库提示pyodbc.Cursor无cursor属性如何解决
报错原因
- 核心问题:
pandas.io.sql.read_sql的con参数要求传入数据库连接对象(即pyodbc.connect返回的conn实例),你错误传入了conn.cursor()生成的游标对象。read_sql内部会自动调用con.cursor()创建游标执行查询,传入游标对象后,会尝试调用游标自身的cursor属性,而pyodbc.Cursor类没有该属性,因此触发报错。 - 额外隐患:你在调用
read_sql后、迭代读取分块结果前就关闭了游标,而chunksize参数返回的是惰性迭代器,只有在迭代时才会真正执行查询读取数据,提前关闭游标会导致后续读取失败。
修复方案
调整参数传入逻辑,将连接对象传给read_sql,同时用上下文管理器自动管理连接生命周期,不需要手动创建、关闭游标,修改后可运行代码如下:
import pyodbc import os import pandas.io.sql as psql from pathlib import Path FILE_EXT = 'csv' BASE_DIR = Path(__file__).resolve().parent TPS_CONNECTION_STRING = ( 'Driver={Topspeed ODBC Driver (Read-Only)};' 'DBQ=X:\\;' 'Extension=tps;' ) query = 'SELECT * FROM vCUSTTRANc;' filename = 'tpstest' save_path = os.path.join(BASE_DIR, f'{filename}.{FILE_EXT}') # 上下文管理器会自动处理连接/游标关闭,不需要手动调用close with pyodbc.connect(TPS_CONNECTION_STRING, autocommit=True) as conn: df_chunks = psql.read_sql(sql=query, con=conn, chunksize=1000) for idx, chunk in enumerate(df_chunks): chunk.to_csv( save_path, index=False, header=(idx == 0), mode='a' )
内容的提问来源于stack exchange,提问作者joween
相关产品推荐
相关产品推荐

