python 2.7でpyodbc
を使用して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
私は以下のようなものを見たいと思っていました(つまり、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
リストはpyodbc
を使用してSQLクエリからデータを返す最良の方法ではありませんか?
コード
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())
クエリ結果を、最初のサブリストとして列名を含むリストのリストとして返す場合(質問の出力例と同様)、次のようなことができます。
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']
結果の使い方にもよりますが、辞書のリストを用意しておくと便利です。例えば:
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'}
リストよりも優れたオプションがあります。 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
リストのリストが必要な場合(これは行ごとに1つのリストを意味します)、次の方法で取得できます。
df.values.tolist() # list of lists
しかし、私はあなたにパンダで働き始めることを強くお勧めします