pyodbcで実行したSELECT文のカラム名を取得する方法

2020-06-23Python

PythonのpyodbcでSQLServer上で実行したSELECT文のカラム名は普通には取得できません。

execute()した結果にある「description」プロパティを参照して取得する必要があります。

pyodbcで実行したSELECT文のカラム名を取得する

pyodbcで実行したSELECT文戻り値は

(1, 'test1', 20, 0), (2, 'test2', 30, 1)

のように「カラム名」はありません。

カラム名を取得するにはexecute()した結果にある「description」プロパティを参照します。

以下は実行したSQLをカラム名でアクセスできるようにしたソースです。

import pyodbc
import pprint

#SQLServerへの設定
driver= "{SQL Server}"
server = "SQLServerが動作するサーバ名"
database = "データベース名"
port = "SQLServerで利用するポート番号"
trusted_connection = "yes"

#SQLServerへ接続
conn = pyodbc.connect(
                          "DRIVER=" + driver + ";"
                        + "SERVER=" + server + ";"
                        + "DATABASE=" + database + ";"
                        + "PORT=" + port + ";"
                        + "Trusted_Connection="    + trusted_connection + ";"
                    )

#SQL実行
cursor = conn.cursor()
rc = cursor.execute( "SELECT * FROM test_table" )
fetch_ret = cursor.fetchall()

#fetchall()の戻り値
pprint.pprint( "fetchall()={0}".format( fetch_ret ))

#カラム名を取得して配列にコピー
fetch_array = []
for data_cnt in range( len( fetch_ret )) :
    columns = [column[0] for column in rc.description]
    tmp = {}
    for col_cnt in range( len( columns )) :
        print( "columns name=[{0}] value=[{1}]".format( columns[ col_cnt ], fetch_ret[ data_cnt ][ col_cnt ] ) )
        tmp[ columns[ col_cnt ] ] = fetch_ret[ data_cnt ][ col_cnt ]
    fetch_array.append( tmp )

#カラム名を使ってデータ取得
pprint.pprint( "fetch_array()={0}".format( fetch_array ))

#カラム名を使ってデータ取得
print( "2レコード目のnameは「{0}」です。".format( fetch_array[ 1 ][ "name" ] ))

#SQLServerを切断
cursor.close()
conn.close()

以下が実行結果です。

#fetchall()の戻り値
"fetchall()=[(1, 'test1', 20, 0), (2, 'test2', 30, 1)]"
#カラム名を取得して配列にコピー
columns name=[no] value=[1]
columns name=[name] value=[test1]
columns name=[age] value=[20]
columns name=[gender] value=[0]
columns name=[no] value=[2]
columns name=[name] value=[test2]
columns name=[age] value=[30]
columns name=[gender] value=[1]
#カラム名を使ってデータ取得
("fetch_array()=[{'no': 1, 'name': 'test1', 'age': 20, 'gender': 0}, {'no': 2, "
 "'name': 'test2', 'age': 30, 'gender': 1}]")
#カラム名を使ってデータ取得
2レコード目のnameは「test2」です。

まとめ

execute()した結果にある「description」プロパティを参照することでpyodbcで実行したSELECT文のカラム名が取得でき、再編集は必要ですが、処理結果をカラム名を使ってアクセスすることができました。

以上、「pyodbcで実行したSELECT文のカラム名を取得する方法」でした。