从pyodbc execute()语句中返回列名

84
from pandas import DataFrame
import pyodbc

cnxn = pyodbc.connect(databasez)
cursor.execute("""SELECT ID, NAME AS Nickname, ADDRESS AS Residence FROM tablez""")
DF = DataFrame(cursor.fetchall())

这可以用来填充我的pandas DataFrame。但是我如何获取

DF.columns = ['ID', 'Nickname', 'Residence']

直接从 游标 中获取?这个信息是否完全存储在 游标 中呢?


4
我希望我能给这个问题点赞100,000次。 - Chicken Sandwich No Pickles
4个回答

155

您可以从游标描述中获取列:

columns = [column[0] for column in cursor.description]


15
如果有人对“.description”中的其他值感到好奇,可以参考以下链接了解更多信息:https://github.com/mkleehammer/pyodbc/wiki/Cursor#attributes - Max Candocia
2
当我尝试这个时,出现了TypeError错误:'NoneType'对象不可迭代。 - RufusVS
2
如果没有返回行,则“description”属性为“None”,会出现“NoneType” TypeError错误,如此处所述:https://code.google.com/archive/p/pyodbc/wikis/Cursor.wiki - johnDanger

53

最近的Pandas有一个更高级别的read_sql函数,可以为您完成这个操作。

import pyodbc
import pandas as pd

cnxn = pyodbc.connect(databasez)
DF = pd.read_sql_query("SELECT ID, NAME AS Nickname, ADDRESS AS Residence FROM tablez", cnxn)

14

如果您在使用由Matti John提供的代码时遇到了NoneType错误,请确保在从数据库检索数据后才进行cursor.description调用,例如:

cursor = cnxn.cursor()
cursor.execute("SELECT * FROM my_table")
columns = [column[0] for column in cursor.description]

这个方法解决了我的问题。


6
在 pandas 上下文中,我发现以下内容完全符合我的期望:
DF.columns = DataFrame(np.matrix(cursor.description))[0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接