web-dev-qa-db-ja.com

PyOdbcでテーブルと列の名前を取得する

PyOdbcカーソルから完全に参照されている列名を取得したいと思います。たとえば、2つの単純なテーブルがあるとします。

  • Table_1(Id, < some other fields >)
  • Table_2(Id, < some other fields >)

結合されたデータを取得したい

select * from Table_1 t1, Table2 t2 where t1.Id = t2.Id

次のようにpyodbcを使用します。

query = 'select * from Table_1 t1, Table2 t2 where t1.Id = t2.Id'

import pyodbc
conn_string = '<removed>'
connection =  pyodbc.connect(conn_string)

cursor = connection.cursor()cursor.execute(query)

次に、列名を取得します。

for row in cursor.description:
    print row[0]

しかし、これを行うと、Idが2回取得されます。理想的には、出力にt1.Idt2.Idを取得できます。

私が考えた解決策のいくつか(そしてなぜ私がそれらを本当に実装したくないのか):

  1. クエリの列の名前を変更します-私の実際のユースケースでは、数十のテーブルがあり、数十の行が頻繁に変更されるものもあります
  2. クエリを解析し、S​​QLクエリの生成を自動化します(基本的に、cursor.tables関数を使用してテーブルのクエリをチェックし、select *を名前付き列のセットに置き換えます)-私も持っている場合これを行いますが、テストハーネスにはやり過ぎのようです

もっと良い方法はありますか?何かアドバイスをいただければ幸いです。

12
Brad

PyOdbcドキュメントの提供

# columns in table x
for row in cursor.columns(table='x'):
    print row.column_name

www.PyOdbc wiki APIドキュメントは便利です

12
Geordie Jon

これが私のやり方です。

import pyodbc
connection = pyodbc.connect('DSN=vertica_standby', UID='my_user', PWD='my_password', ansi=True)
cursor = connection.cursor()
for row in cursor.columns(table='table_name_in_your_database'):
    print row.column_name

DSN(データソース名)を2つのファイルで設定する必要があります。 odbc.iniおよびodbcinst.ini

1
Russell Lego