2016-08-08 8 views
2

私はデータベース(Python、Postgres)から取得した結果セットのフィールドのテーブル名を取得しようとしています。フィールドにテーブル名を取得する関数がPHPであり、私はそれを使用したので、それが動作することがわかっています(PHPで)。私はPythonで同様の関数を探しています。データベース結果のフィールドのテーブル名をPython(PostgreSQL)

pg_field_table() PHPの関数は結果とフィールド番号を取得し、 "フィールドが属するテーブルの名前を返します"。それはまさに私が必要とするものですが、Pythonではそうです。

シンプルexaple - 、行を挿入し、選択したデータをテーブルを作成します。

CREATE TABLE table_a (
    id INT, 
    name VARCHAR(10) 
); 

CREATE TABLE table_b (
    id INT, 
    name VARCHAR(10) 
); 

INSERT INTO table_a (id, name) VALUES (1, 'hello'); 
INSERT INTO table_b (id, name) VALUES (1, 'world'); 

psycopg2sqlalchemyを使用している場合、私は右のデータと右フィールド名を得たが、テーブル名の情報なし。

import psycopg2 

query = ''' 
    SELECT * 
    FROM table_a A 
    LEFT JOIN table_b B 
     ON A.id = B.id 
''' 

con = psycopg2.connect('dbname=testdb user=postgres password=postgres') 
cur = con.cursor() 
cur.execute(query) 

data = cur.fetchall() 
print('fields', [desc[0] for desc in cur.description]) 
print('data', data) 

上記の例では、フィールド名が表示されています。出力は次のとおりです。

fields ['id', 'name', 'id', 'name'] 
data [(1, 'hello', 1, 'world')] 

私はcursor.descriptionがあることを知っているが、それは、テーブル名、単にフィールド名が含まれていません。

必要なもの - 未処理のSQLを使用してデータを照会するときに、結果セットのフィールドのテーブル名を取得する方法がいくつかあります。

EDIT 1: "hello"が "table_a"または "table_b"から来たかどうかを知る必要があります。両方のフィールドの名前は同じです( "name")。テーブル名に関する情報がなければ、値がどのテーブルであるかを知ることができません。

EDIT 2:私は、SQLの別名のようないくつかの回避策があることを知っている:SELECT table_a.name AS name1, table_b.name AS name2は、私は実際に結果セットからテーブル名を取得する方法を求めています。時々私は私がすべての生のSQLクエリを記述することができます解決策を探しています、SELECT *、時々と、そのクエリを実行した後、私はフィールド名と、結果セットのフィールドのテーブル名を取得します:

EDIT 3

+1

クエリを実行したときにすでにテーブル名を知っていました。 – e4c5

+0

SQLエイリアスを使用する – polku

+0

'Output'ノードで' explain(verbose) 'から情報を得ることができます。あなたの例では、出力は 'Output:A.id、A.name、B.id、B.name'です。 'format'オプションを使用して、希望するフォーマットの情報を取得します:' explain(verbose、format json)... 'しかし、どのような複雑なクエリは 'のような最高の(A.name、B.name)から名前を選択...'ソーステーブルは、各行のさまざまなことができますか? – Abelisto

答えて

1

テーブル修飾された列名のpg_attribute catalogを照会する必要がある:

query = ''' 
    select 
     string_agg(format(
      '%%1$s.%%2$s as "%%1$s.%%2$s"', 
      attrelid::regclass, attname 
     ) , ', ') 
    from pg_attribute 
    where attrelid = any (%s::regclass[]) and attnum > 0 and not attisdropped 
''' 

cursor.execute(query, ([t for t in ('a','b')],)) 
select_list = cursor.fetchone()[0] 

query = ''' 
    select {} 
    from a left join b on a.id = b.id 
'''.format(select_list) 

print cursor.mogrify(query) 
cursor.execute(query) 
print [desc[0] for desc in cursor.description] 

が出力:

select a.id as "a.id", a.name as "a.name", b.id as "b.id", b.name as "b.name" 
    from a left join b on a.id = b.id 

['a.id', 'a.name', 'b.id', 'b.name'] 
+0

ご返信ありがとうございます。ソリューションはSELECT *のために構築されています。私は私が(SELECTの後に)取得したい列を指定するどこで生のSQLクエリを実行することができますソリューションを探しています。その後、クエリを実行した後、フィールド名とテーブル名を含む結果セットの選択されたフィールドのみを取得します。 – dwich

+0

@dwich 'select *'はあなたの要求したものです –

+0

あなたは正しいです、私は上記の例でSELECT *を使用しました。しかし、私は任意の未加工のSQL - SELECT *を使用することができるソリューションを探しています。または検索するフィールドをリストします(そして、それらのフィールドがどのテーブルかを調べます)。私は質問を更新しました(EDIT 3)。 – dwich

関連する問題