使用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
相关产品推荐
相关产品推荐

