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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 17:36:01