如何使用Python将PostgreSQL多表查询的Tuple类型结果转换为带列名的单一字典
解决PostgreSQL查询结果(Tuple)转带列名字典的问题
嘿,我帮你捋捋你现在遇到的问题哈~你想用psycopg2把查询到的元组结果转成带列名的字典,但当前代码里的dict(zip(results))写法不对,而且还没拿到查询结果的列名,这才导致出错。咱们一步步来改:
先说说你代码里的问题
- 没获取列名:psycopg2的cursor执行查询后,
cursor.description里存储了结果的列信息,你需要从中提取列名,才能让字典有对应的键 - zip用法错误:
dict(zip(a, b))需要两个长度一致的可迭代对象,你直接传results(这是行元组的列表),zip没法生成合法的键值对 - 循环逻辑问题:你每次循环都会覆盖
dict1,而且表名和结果的绑定逻辑也没生效
正确的实现方式
如果你的需求是每张表的查询结果转成“行字典”的列表,再把所有表的结果统一存在一个大字典里(键是表名,值是对应行的字典列表),可以这么改代码:
import psycopg2 # 建立数据库连接 conn = psycopg2.connect( database="CONNETpy", user='postgres', password='pass', host='localhost', port='5432' ) cursor = conn.cursor() tables = ["Class_A", "Class_B", "Class_C"] # 用来存储所有表的结果字典 all_table_results = {} for table in tables: cursor.execute(f"SELECT * FROM {table}") # 获取查询结果的列名 columns = [desc[0] for desc in cursor.description] # 获取所有行数据 rows = cursor.fetchall() # 把每行元组转成带列名的字典 table_dict_list = [dict(zip(columns, row)) for row in rows] # 把当前表的结果存入大字典 all_table_results[table] = table_dict_list # 打印结果看看 for table_name, results in all_table_results.items(): print(f"--- {table_name} 的结果 ---") for row_dict in results: print(row_dict) # 别忘了关闭连接 cursor.close() conn.close()
代码解释
- 提取列名:
cursor.description返回一个列表,每个元素对应一列的元数据,取每个元素的第一个值(desc[0])就是列名 - 行转字典:用列表推导式遍历每一行,
zip(columns, row)会把列名和行里的每个值一一配对,再用dict()转成字典 - 存储所有表结果:用
all_table_results这个大字典,把每张表的名字作为键,对应的行字典列表作为值,这样就能统一管理三张表的结果啦
如果你想要的是每张表的所有结果整合成一个单一字典(比如把列名作为键,对应所有行的值列表),可以调整这部分代码:
# 替换上面的table_dict_list行 table_single_dict = {} for col in columns: table_single_dict[col] = [] for row in rows: for idx, val in enumerate(row): table_single_dict[columns[idx]].append(val) all_table_results[table] = table_single_dict
这样每个表对应的字典里,键是列名,值是该列所有行的数值列表~
内容的提问来源于stack exchange,提问作者Prem
相关产品推荐
相关产品推荐

