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

使用pyodbc查询SQL Server多列时合并为一列并报错的问题

问题原因

你遇到的报错是因为pyodbc的cursor对象直接传入pandas.DataFrame时,pandas会把每一行的整条记录当成单个元素,而非拆分成独立的列。你的查询明明返回两列,但DataFrame实际接收到的是18个包含两个元素的列表,每个列表作为单列的一行值。这时你指定了2列的columns,自然会出现形状不匹配的报错。

去掉columns参数后,pandas就把这些列表当作单列数据处理,所以会显示成[John, Smith]这样的格式。

解决方法

有两种简单的修复方式:

方法1:用fetchall()获取结构化数据

先通过fetchall()把查询结果取出来,再传入DataFrame,这样pandas能正确识别多列结构:

conn = pyodbc.connect(cxn) #cxn是你的连接字符串,此处无问题
cursor = conn.cursor()
cursor.execute("Select [FirstName], [LastName] from [People] where [ID] > 500")
rows = cursor.fetchall() # 获取所有行的结构化数据
peeps = pd.DataFrame(rows, columns = [i[0] for i in cursor.description])

方法2:用pandas.read_sql_query(更简洁推荐)

直接用pandas内置的read_sql_query方法,它会自动处理pyodbc的连接和结果解析,不用手动操作cursor:

import pandas as pd
import pyodbc

conn = pyodbc.connect(cxn)
query = "Select [FirstName], [LastName] from [People] where [ID] > 500"
peeps = pd.read_sql_query(query, conn)

这种方法更省心,pandas已经封装了所有细节,能避免手动处理cursor时的结构问题,这也是你之前在Teradata中没出问题的原因——当时的代码大概率用了类似的封装逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:14:55