无法将pyodbc游标转换为数据帧.执行结果



我尝试使用pyodbc运行SQL,但无法将结果转换为数据框架。我收到错误消息-
ValueError:传递值的形状为(47,1(,索引表示(47,3(。

对于名称,我得到了一个字符串列表["ID"、"国家"、"日期"]

对于行,我得到了一个元组列表,如[('A1','USA',datetime.date(2011,12,31((,('A1'','USA,datetime_date(2020,4,21((,…('A3','Cananda',datetime.date(2001,2,11((]

如果我使用pandas.read_sql,对同一个表的查询可以很好地工作。我会得到47行3列,而不是1列。但是,由于需要合并SQL的本地列表,我需要使用cursor.execute。实际的列表要长得多,包含数百个id。关于如何转换结果有什么想法吗?

import pyodbc
import pandas as pd
conn = pyodbc.connect("DSN=dsn")
conn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
conn.setencoding(encoding="utf-8")
cursor = conn.cursor()
list_id = ["A1","A2","A3"]
placeholders = ",".join("?" * len(list_id))
sql = "select * from table Where ID in (%s)"  % placeholders
cursor.execute(sql, list_id)
names = [ x[0] for x in cursor.description]
rows = cursor.fetchall()
cursor.close()
conn.close()
df = pd.DataFrame(rows, columns =names)
df

好的。我想明白了。只需要重塑行的形状。

import pyodbc
import numpy as np
import pandas as pd
conn = pyodbc.connect("DSN=dsn")
conn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
conn.setencoding(encoding="utf-8")
cursor = conn.cursor()
pid = ["P077856","P079661"]
placeholders = ",".join("?" * len(pid))
sql = "select PROJ_ID, ROLE_CODE from PROJECT.PROJECT_TEAM_V2 Where PROJ_ID in (%s)"  % placeholders
cursor.execute(sql, pid)
names = [ x[0] for x in cursor.description]
rows = cursor.fetchall()
rows = np.array(rows).reshape(47,3)
df = pd.DataFrame(rows, columns =names)
df

最新更新