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

在Python(PostgreSQL)中获取数据库结果中字段的表名,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在尝试从数据库(Python、Postgres)获取结果集中字段的表名。PHP中有一个函数用于获取字段的表名,我使用了它,它工作正常,所以我知道它可以(在PHP中)完成。我正在Python中寻找类似的函数 PHP中的函数获取结果和字段号,并“返回该字段所属表的名称”。这正是我需要的,但是在Python中 简单示例-创建表、插入行、选择数据: CREATE TABLE table_a ( id INT, name VARCHAR(10) ); CREATE TABLE tab

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

PHP中的函数获取结果和字段号,并“返回该字段所属表的名称”。这正是我需要的,但是在Python中

简单示例-创建表、插入行、选择数据:

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');
使用
psycopg2
sqlalchemy
时,我得到了正确的数据和字段名,但没有关于表名的信息

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别名:
选择table_a.name作为name1,table_b.name作为name2
,但我确实在问如何从结果集中检索表名


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

有必要查询表中的限定列名:

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']

运行查询时您已经知道表名。您可以从
输出
节点的
explain(verbose)
获取一些信息。例如,输出可以是
输出:A.id、A.name、B.id、B.name
。使用
format
选项以所需格式获取信息:
explain(verbose,format json).
例如。但是,对于更复杂的查询,例如
选择最大值(A.name,B.name)作为来自…
的名称,其中每行的源表可以是不同的。谢谢您的回复。您的解决方案是为SELECT*构建的。我正在寻找一种解决方案,允许我运行任何原始SQL查询,在其中指定要检索的列(在选择之后)。然后,在执行查询后,我希望在结果集中只获得具有字段名和表名的选定字段。@dwich
select*
是您要求的。您是对的,我在上面的示例中使用了select*。然而,我正在寻找一种解决方案,它允许我使用任何我想要检索的原始SQL-SELECT*或列表字段(然后找出这些字段来自哪个表)。我更新了问题(编辑3)。