从pyodbc execute()语句返回列名

dmv*_*nna 35 python pyodbc pandas

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())
Run Code Online (Sandbox Code Playgroud)

这可以填充我的pandas DataFrame.但我怎么得到

DF.columns = ['ID', 'Nickname', 'Residence']
Run Code Online (Sandbox Code Playgroud)

直接从光标?该信息是否完全存储在光标中?

Mat*_*ohn 81

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

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

  • 万一有人好奇`.description`中的其他值是什么意思:https://github.com/mkleehammer/pyodbc/wiki/Cursor#attributes (6认同)
  • 尝试此操作时,出现TypeError:“ NoneType”对象不可迭代。 (2认同)
  • 当由于没有返回行而“description”属性为“None”时,将出现“NoneType”类型错误,如下所述:https://code.google.com/archive/p/ pyodbc/wikis/Cursor.wiki (2认同)

小智 33

最近的大熊猫有更高级别的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)
Run Code Online (Sandbox Code Playgroud)


小智 10

如果您遇到NoneType来自Matti John提供的代码的错误,请确保从数据库中检索数据进行cursor.description调用。一个例子:

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

这为我修好了。


dmv*_*nna 5

改进上一个答案,在熊猫的背景下,我发现这正是我所期望的:

DF.columns = DataFrame(np.matrix(cursor.description))[0]
Run Code Online (Sandbox Code Playgroud)