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のカラム名を取得する方法でした。