pythonのpyodbcを使えばSQLServerなどにODBCを経由して接続することができます。
ただ困ったことに実行したSQLの結果にカラム名を使ってアクセスすることができません。
Sqlite3ならSQLConnectionのrow_factoryプロパティに「sqlite3.Row」を設定するだけでできるのですが・・・
そこで今回はSqlite3と同様に実行したSQLの結果にカラム名を使ってアクセスするためにSQLからカラム名を抜き出します。
pyodbcで実行したSQLのカラム名を取得する
pyodbcで実行したSQLのカラム名を取得するにはちょっとした工夫が必要です。
pyodbcで実行したSQLの結果をfecthall()で取得すると「pyodbc.Row」という配列の中に配列らしきものになって返ってきます。
これをそのまま配列としても使えないし、どうにも扱いにくい形です。
なので、これを実行したSQLの結果にある「description」プロパティを利用してカラム名を取得して扱えるようにします。
import pyodbc
#SQLServerへの設定
driver= "{SQL Server}"
server = "SQLServerが動作するサーバー名"
database = "データベース名"
port = "試用するポート名"
trusted_connection = "yes"
#SQLServerへ接続
conn = pyodbc.connect(
"DRIVER=" + driver + ";"
+ "SERVER=" + server + ";"
+ "DATABASE=" + database + ";"
+ "PORT=" + port + ";"
+ "Trusted_Connection=" + trusted_connection + ";"
)
#SQL実行
cursor = conn.cursor()
result = cursor.execute( "SELECT id AS id, name AS name FROM test_table" )
ret = cursor.fetchall()
#カラム名取得
dummy= []
for data_cnt in range( len( ret )) :
columns = [ column[ 0 ] for column in result.description ]
tmpdic = {}
for col_cnt in range( len( columns )) :
print( "column name is [{0}].".format( columns[ col_cnt ] ))
tmpdic[ columns[ col_cnt ] ] = ret[ data_cnt ][ col_cnt ]
dummy.append( tmpdic )
ret = dummy
#SQLServerを切断
cursor.close()
conn.close()
カラム名は以下の通り
column name is [id]. column name is [name].
と取得できています。
これで「ret」にはデータベースから取得した件数分の配列にカラム名で値が設定されているデータが作成されています。
まとめ
pythonのpyodbcを使用して実行したSQLのカラム名を取得するには、取得した結果の「description」プロパティを検索することで取得することができます。
以上、pyodbcを使用して実行したSQLのカラム名を取得する方法でした。
