web-dev-qa-db-fra.com

Récupérer des données à partir de SQL en utilisant pyodbc

J'essaie de récupérer des données d'un serveur SQL en utilisant pyodbc et de les imprimer dans une table en utilisant Python. Cependant, je ne peux que sembler récupérer le nom de la colonne et le type de données, etc., pas les valeurs de données réelles dans chaque ligne de la colonne.

Fondamentalement, j'essaie de répliquer une feuille Excel qui récupère les données du serveur et les affiche dans un tableau. Je n'ai aucun problème à me connecter au serveur, juste le fait que je n'arrive pas à trouver les données qui entrent dans la table.

Voici un exemple de mon code:

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=SQLSRV01;DATABASE=DATABASE;UID=USER;PWD=PASSWORD')
cursor = cnxn.cursor()

cursor.execute("SELECT * FROM sys.tables")
tables = cursor.fetchall()
#cursor.execute("SELECT WORK_ORDER.TYPE,WORK_ORDER.STATUS, WORK_ORDER.BASE_ID, WORK_ORDER.LOT_ID FROM WORK_ORDER")

for row in cursor.columns(table='WORK_ORDER'):
    print row.column_name
    for field in row:
        print field

Cependant, le résultat de ceci me donne simplement des choses comme le nom de la table, les noms des colonnes, des entiers, "None" et des choses comme ça qui ne m'intéressent pas:

STATUS_EFF_DATE
DATABASE
dbo
WORK_ORDER
STATUS_EFF_DATE
93
datetime
23
16
3
None
0
None
None
9
3
None
80
NO
61

Donc, je ne suis pas vraiment sûr où je peux obtenir les valeurs pour remplir mon tableau. Cela devrait-il être dans la table = 'WORK_ORDER', mais pourrait-il être sous un nom de table différent? Existe-t-il un moyen d’imprimer les données qui me manque?

Tout conseil ou suggestion serait grandement apprécié.

26
Mike

Tu es si proche!

import pyodbc
cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=SQLSRV01;DATABASE=DATABASE;UID=USER;PWD=PASSWORD')
cursor = cnxn.cursor()

cursor.execute("SELECT WORK_ORDER.TYPE,WORK_ORDER.STATUS, WORK_ORDER.BASE_ID, WORK_ORDER.LOT_ID FROM WORK_ORDER")
for row in cursor.fetchall():
    print row

(la fonction "columns ()" collecte des métadonnées sur les colonnes de la table nommée, par opposition aux données réelles).

44
Chris Curvey

Afin de recevoir les données réelles stockées dans la table, vous devez utiliser l’une des fonctions fetch ... () ou utiliser le curseur comme itérateur (c'est-à-dire "pour la ligne dans le curseur" ...). Ceci est décrit dans la documentation :

cursor.execute("select user_id, user_name from users where user_id < 100")
rows = cursor.fetchall()
for row in rows:
    print row.user_id, row.user_name
7
anonymous_user

Au lieu d'utiliser la bibliothèque pyodbc, utilisez la bibliothèque pypyodbc ... Cela a fonctionné pour moi.

import pypyodbc

conn = pypyodbc.connect("DRIVER={SQL Server};"
                    "SERVER=server;"
                    "DATABASE=database;"
                    "Trusted_Connection=yes;")

cursor = conn.cursor()
cursor.execute('SELECT * FROM [table]')

for row in cursor:
    print('row = %r' % (row,))
1
beebus