我正在尝试从数据库(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');
使用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别名:SELECT table_a.name AS name1, table_b.name AS name2
但我真的在问如何从结果集中检索表名。
编辑3 :我正在寻找允许我编写任何原始SQL查询的解决方案,有时SELECT *
,有时SELECT A.id, B.id ...
,执行该查询后我会得到结果集中字段的字段名称和表名。
答案 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]