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

使用pyodbc和pandas导出SQL Server数据到Excel仅获表头无数据求助

解决Python导出SQL Server数据到Excel仅显示列标题的问题

嘿,我看到你的问题啦!这是个很常见的新手小坑,咱们来快速搞定它~

问题根源

你代码里犯了一个典型的游标使用错误:你连续调用了两次cursor.fetchall():

data = cursor.fetchall()  # 第一次取出所有数据,游标移到结果集末尾
df = pd.DataFrame([tuple(t) for t in cursor.fetchall()], columns=columns)  # 第二次取的时候已经没有数据了

数据库游标是单向的,第一次fetchall()已经把所有结果都取出来了,第二次调用自然只能拿到空列表,所以你的DataFrame就只有列标题,没有实际数据。

修正方案1:复用第一次取出的数据

既然已经把数据存在data变量里了,直接用它来构建DataFrame就行,不用再调用一次fetchall():

import pyodbc
import pandas as pd

cnxn = pyodbc.connect("Driver={SQL Server};SERVER=hostname;Database=Practice;UID=XXX;PWD=XXX")
cursor = cnxn.cursor()
cursor.execute('SELECT * FROM insurance')
columns = [desc[0] for desc in cursor.description]
data = cursor.fetchall()
df = pd.DataFrame(data, columns=columns)  # 直接用已取出的data变量
writer = pd.ExcelWriter('foo.xlsx')
df.to_excel(writer, sheet_name='bar')
writer.save()

另外,cursor.fetchall()返回的本身就是元组组成的列表,所以不需要额外做tuple(t)的转换,直接传入DataFrame就行。

修正方案2:用pandas内置方法更简洁

其实pandas已经提供了更方便的数据库读取方法read_sql_query,可以帮你省去手动处理游标、列名的步骤,代码更简洁也更不容易出错:

import pyodbc
import pandas as pd

cnxn = pyodbc.connect("Driver={SQL Server};SERVER=hostname;Database=Practice;UID=XXX;PWD=XXX")
df = pd.read_sql_query('SELECT * FROM insurance', cnxn)  # 一步搞定数据读取和列名设置

writer = pd.ExcelWriter('foo.xlsx')
df.to_excel(writer, sheet_name='bar')
writer.save()

进阶优化:自动管理连接和文件资源

推荐使用with语句来自动管理数据库连接和Excel写入器,这样不用手动调用关闭方法,更安全:

import pyodbc
import pandas as pd

# 自动关闭数据库连接
with pyodbc.connect("Driver={SQL Server};SERVER=hostname;Database=Practice;UID=XXX;PWD=XXX") as cnxn:
    df = pd.read_sql_query('SELECT * FROM insurance', cnxn)

# 自动保存并关闭Excel写入器
with pd.ExcelWriter('foo.xlsx') as writer:
    df.to_excel(writer, sheet_name='bar')

内容的提问来源于stack exchange,提问作者Pinakpani Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:11:08