在Python(PostgreSQL)中获取数据库结果中字段的表名
我正在尝试从数据库(Python、Postgres)获取结果集中字段的表名。PHP中有一个函数用于获取字段的表名,我使用了它,它工作正常,所以我知道它可以(在PHP中)完成。我正在Python中寻找类似的函数 PHP中的函数获取结果和字段号,并“返回该字段所属表的名称”。这正是我需要的,但是在Python中 简单示例-创建表、插入行、选择数据:在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
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查询,在其中指定要检索的列(在选择之后)。然后,在执行查询后,我希望在结果集中只获得具有字段名和表名的选定字段。@dwichselect*
是您要求的。您是对的,我在上面的示例中使用了select*。然而,我正在寻找一种解决方案,它允许我使用任何我想要检索的原始SQL-SELECT*或列表字段(然后找出这些字段来自哪个表)。我更新了问题(编辑3)。