web-dev-qa-db-fra.com

Comment retourner une liste d'une requête SQL en utilisant pyodbc?

J'essaie d'exécuter une requête de sélection pour extraire des données de SQL Server à l'aide de pyodbc en python 2.7. Je veux que les données soient renvoyées dans une liste. Le code que j'ai écrit est ci-dessous. 

Ça marche un peu, mais pas comme je l’espérais. Ma liste retournée ressemble à quelque chose comme ci-dessous:

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

J'espérais voir quelque chose comme ci-dessous (c'est-à-dire ma table en 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

Une liste ne constitue-t-elle pas le meilleur moyen de renvoyer des données d'une requête SQL en utilisant pyodbc?

Code

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())
5
mHelpMe

Si vous souhaitez renvoyer les résultats de votre requête sous forme de liste de listes avec les noms de colonne comme première sous-liste (similaire à l'exemple de sortie de votre question), vous pouvez procéder de la manière suivante:

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']

En fonction de votre utilisation des résultats, je trouve souvent plus utile d’avoir une liste de dict. Par exemple:

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'}
1
benvc

Il existe même une meilleure option qu'une liste, essayez Pandas DataFrame ! Cela vous aidera à gérer les noms de colonne et à appliquer des opérations de type colonne!

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

MODIFIER:

Si vous préférez une liste de listes (cela signifie une liste par ligne), vous pouvez l'obtenir en:

df.values.tolist()  # list of lists 

Mais je vous recommande fortement de commencer à travailler avec des pandas

2
m33n