web-dev-qa-db-ja.com

pyodbcを使用してSQLからデータを取得する

Pyodbcを使用してSQLサーバーからデータを取得し、Pythonを使用してテーブルに印刷しようとしています。ただし、列の各行の実際のデータ値ではなく、列名とデータ型などを取得するようにしか見えません。

基本的に、サーバーデータを取得してテーブルに表示するExcelシートを複製しようとしています。サーバーに接続するのに何の問題もありません。ただ、テーブルに入る実際のデータを見つけることができないようです。

これが私のコードの例です:

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

ただし、この結果は、テーブル名、列名、いくつかの整数、「なし」など、興味のないものを提供してくれます。

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

だから、テーブルを埋めるために値をどこで取得できるのか本当にわかりません。 table = 'WORK_ORDER'にあるはずですが、別のテーブル名の下にある可能性がありますか?不足しているデータを印刷する方法はありますか?

アドバイスや提案は大歓迎です。

33
Mike

あなたはとても近いです!

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

(「columns()」関数は、実際のデータではなく、名前付きテーブルの列に関するメタデータを収集します)。

53
Chris Curvey

テーブルに保存されている実際のデータを受け取るには、fetch ...()関数の1つを使用するか、カーソルをイテレータとして使用する必要があります(つまり、「for row in cursor」...)。これは 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
9
anonymous_user

Pandas=を使用して情報を取得し、データフレームとして取得することができます

import pyodbc as cnn
import pandas as pd

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

# Copy to Clipboard for paste in Excel sheet
def copia (argumento):
    df=pd.DataFrame(argumento)
    df.to_clipboard(index=False,header=True)


tableResult = pd.read_sql("SELECT * FROM YOURTABLE", cnxn) 

# Copy to Clipboard
copia(tableResult)

# Or create a Excel file with the results
df=pd.DataFrame(tableResult)
df.to_Excel("FileExample.xlsx",sheet_name='Results')

これがお役に立てば幸いです!乾杯!

3
Raul Guerrero

Pyodbcライブラリを使用する代わりに、pypyodbcライブラリを使用してください...これは私のために働いた。

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

賛成の回答は私にとってはうまくいきませんでした。次のように接続線を編集することで修正されました(セミコロンをコマで置き換え、それらの引用符も削除する):

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
0
PKInd007