使用psycopg2查询PostgreSQL数据库仅返回各表最后一条数据的问题排查
问题分析与解决
嘿,我一眼就看到问题出在哪啦!你现在每个表只输出最后一条数据,是因为你在遍历行的时候,每次都用新的行数据覆盖了同一个字典,而且没有把所有行的字典收集起来。
具体错误点
在你的原代码里,每次循环行的时候,你都重新赋值了inner_dict:
inner_dict={ 'name':name, 'department':department, 'overall_percentage':overall_percentage }
这意味着,每一行都会把之前的inner_dict完全替换掉,所以最后outer_dict[table]只能拿到最后一行的字典,而不是所有行的集合。
修正方案
要实现每个表输出全部数据,你需要把每个表的行数据收集到一个列表里,而不是每次覆盖同一个字典。下面是修正后的完整代码:
import psycopg2 # 建立数据库连接 conn = psycopg2.connect( database="CONNE py", user='postgres', password='asdf', host='localhost', port= '5432' ) cursor = conn.cursor() tables = ["Class_A", "Class_B", "Class_C"] outer_dict = {} for table in tables: cursor.execute(f'SELECT name, department, overall_percentage FROM {table}') rows = cursor.fetchall() # 创建一个空列表,用来存储当前表的所有行数据 table_rows = [] for row in rows: name, department, overall_percentage = row # 为当前行创建一个独立的字典 row_data = { 'name': name, 'department': department, 'overall_percentage': overall_percentage } # 将行字典添加到列表中,这样就不会覆盖之前的数据了 table_rows.append(row_data) # 把整个列表赋值给外层字典的表名键 outer_dict[table] = table_rows print(outer_dict) cursor.close() conn.close() # 别忘了关闭连接,避免资源浪费!
关键改进说明
- 把原来的
inner_dict换成了table_rows列表,专门用来收集当前表的所有行数据 - 每行数据都会生成一个独立的
row_data字典,然后用append()方法添加到列表里,这样所有行的数据都会被保留 - 最后将整个列表赋值给
outer_dict[table],这样每个表对应的就是所有行字典组成的列表,完全符合你的期望输出格式
内容的提问来源于stack exchange,提问作者prem
相关产品推荐
相关产品推荐

