获取Python中数据库结果中字段的表名(PostgreSQL)

时间:2016-08-08 15:05:05

标签: python postgresql psycopg2

我正在尝试从数据库(Python,Postgres)获取结果集中的字段的表名。在PHP中有一个函数来获取字段的表名,我使用它并且它可以工作,所以我知道它可以完成(在PHP中)。我在Python中寻找类似的功能。

PHP中的

pg_field_table()函数获取结果和字段编号,并“返回该字段所属的表的名称”。这正是我需要的,但在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查询数据时,某种方法可以检索结果集中字段的表名。

编辑1 :我需要知道“hello”是否来自“table_a”或“table_b”,两个字段的名称相同(“name”)。如果没有关于表名的信息,则无法判断该值是在哪个表中。

编辑2 :我知道有一些解决方法,比如SQL别名:SELECT table_a.name AS name1, table_b.name AS name2但我真的在问如何从结果集中检索表名。

编辑3 :我正在寻找允许我编写任何原始SQL查询的解决方案,有时SELECT *,有时SELECT A.id, B.id ...,执行该查询后我会得到结果集中字段的字段名称和表名。

1 个答案:

答案 0 :(得分:1)

有必要在pg_attribute catalog查询表限定列名:

summary(pred_logreg)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-14.5600  -2.1220  -1.8700  -1.9890  -1.7090  -0.9459 

输出:

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]