You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 10:47:45