如何使用pyodbc从SQL查询返回列表?

mHe*_*pMe 7 python list pyodbc python-2.7

我试图运行一个选择查询来使用pyodbcpython 2.7 从SQL Server检索数据.我希望数据在列表中返回.我写的代码如下.

它有点工作,但不符合我的预期.我的返回列表如下所示:

Index     Type     Size        Value
0         Row      1           Row object of pyodbc module
1         Row      1           Row object of pyodbc module
...
105       Row      1           Row object of pyodbc module
Run Code Online (Sandbox Code Playgroud)

我希望看到类似下面的内容(即我在SQL中的表)

ActionId   AnnDate      Name    SaleValue
128929     2018-01-01   Bob     105.3
193329     2018-04-05   Bob     1006.98
...
23654      2018-11-21   Bob     103.32
Run Code Online (Sandbox Code Playgroud)

列表不是使用SQL查询返回数据的最佳方法pyodbc吗?

import pyodbc


def GetSQLData(dbName, query):

    sPass = 'MyPassword'
    sServer = 'MyServer\\SQL1'
    uname = 'MyUser'

    cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                    "Server=" + sServer + ";"
                    "Database=" + dbName + ";"
                    "uid=" + uname + ";pwd=" + sPass)

    cursor = cnxn.cursor()
    cursor.execute(query)

    return list(cursor.fetchall())
Run Code Online (Sandbox Code Playgroud)

ben*_*nvc 6

如果要将查询结果作为列表列表返回,并将列名作为第一个子列表(类似于问题中的示例输出),则可以执行以下操作:

import pyodbc


cnxn = pyodbc.connect("YOUR_CONNECTION_STRING")
cursor = cnxn.cursor()

cursor.execute("YOUR_QUERY")

columns = [column[0] for column in cursor.description]
results = [columns] + [row for row in cursor.fetchall()]

for result in results:
    print result

# EXAMPLE OUTPUT
# ['col1', 'col2']
# ['r1c1', 'r1c2']
# ['r2c1', 'r2c2']
Run Code Online (Sandbox Code Playgroud)

根据您使用结果的方式,我经常发现拥有一个字典列表更有用。例如:

results = [dict(zip(columns, row)) for row in cursor.fetchall()]

for result in results:
    print result

# EXAMPLE OUTPUT
# {'col1': 'r1c1', 'col2':'r1c2'}
# {'col1': 'r2c1', 'col2':'r2c2'}
Run Code Online (Sandbox Code Playgroud)


m33*_*33n 5

还有比列表更好的选择,试试Pandas DataFrame!它有助于处理列名并应用列明智的操作!

import pandas as pd
import pyodbc


def GetSQLData(dbName, query):

    sPass = 'MyPassword'
    sServer = 'MyServer\\SQL1'
    uname = 'MyUser'

    cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                    "Server=" + sServer + ";"
                    "Database=" + dbName + ";"
                    "uid=" + uname + ";pwd=" + sPass)


    df = pd.read_sql(cnxn, query)

    return df  # Pandas Dataframe
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您更喜欢列表列表(这意味着每行一个列表),您可以通过以下方式获取它:

df.values.tolist()  # list of lists 
Run Code Online (Sandbox Code Playgroud)

但我强烈建议你开始使用熊猫

  • @ 9769953 - *“数据框本身可能包含问题中给出的列:'0,行,1,pyodbc 模块的行对象'”*。不,不会。pandas 会将 `pyodbc.Row` 对象解压到一个合适的 DataFrame 中。试试看。 (2认同)