pyodbcを使用して実行したSQLのカラム名を取得する方法

プログラミング Python

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

タイトルとURLをコピーしました