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

如何逐个打印PostgreSQL数据库中的多张表?cursor.fetchall()为何无法实现该功能?

问题原因分析

你遇到的问题核心在于psycopg2的游标(cursor)只能保留最近一次执行的查询结果集。每次调用cursor.execute()时,游标会清空之前存储的结果,替换成新查询的结果。所以当你连续执行三次execute后,再调用fetchall(),只能获取最后一次查询(Table_C)的数据,前两次的结果已经被覆盖丢失了。

解决方案

下面提供几种实用的实现方式,帮你逐个打印多张表的数据:

方式一:执行一次查询就立即获取并打印结果

这是最直接的方式,每次执行完针对某张表的查询后,马上调用fetchall()获取结果并打印,避免结果被后续查询覆盖:

import psycopg2
conn = psycopg2.connect(
 database="Sample",
 user='postgres',
 password='password',
 host='localhost',
 port= '5432'
)
cursor = conn.cursor()

# 处理Table_A
cursor.execute("SELECT * FROM Table_A")
print("=== Table_A 数据 ===")
print(cursor.fetchall())

# 处理Table_B
cursor.execute("SELECT * FROM Table_B")
print("\n=== Table_B 数据 ===")
print(cursor.fetchall())

# 处理Table_C
cursor.execute("SELECT * FROM Table_C")
print("\n=== Table_C 数据 ===")
print(cursor.fetchall())

# 记得关闭游标和连接
cursor.close()
conn.close()

方式二:使用多个游标分别存储不同表的结果

如果你希望先执行所有查询,再统一处理结果,可以为每个表创建单独的游标,每个游标对应一个查询的结果集:

import psycopg2
conn = psycopg2.connect(
 database="Sample",
 user='postgres',
 password='password',
 host='localhost',
 port= '5432'
)

# 为每个表创建独立游标
cursor_a = conn.cursor()
cursor_a.execute("SELECT * FROM Table_A")

cursor_b = conn.cursor()
cursor_b.execute("SELECT * FROM Table_B")

cursor_c = conn.cursor()
cursor_c.execute("SELECT * FROM Table_C")

# 逐个打印结果
print("=== Table_A 数据 ===")
print(cursor_a.fetchall())
print("\n=== Table_B 数据 ===")
print(cursor_b.fetchall())
print("\n=== Table_C 数据 ===")
print(cursor_c.fetchall())

# 关闭所有游标和连接
cursor_a.close()
cursor_b.close()
cursor_c.close()
conn.close()

方式三:封装成函数减少重复代码

如果需要处理的表数量较多,建议把查询和打印的逻辑封装成函数,提升代码的可读性和复用性:

import psycopg2

def fetch_and_print_table(cursor, table_name):
    """查询指定表并打印结果"""
    cursor.execute(f"SELECT * FROM {table_name}")
    print(f"\n=== {table_name} 数据 ===")
    print(cursor.fetchall())

conn = psycopg2.connect(
 database="Sample",
 user='postgres',
 password='password',
 host='localhost',
 port= '5432'
)
cursor = conn.cursor()

# 依次处理每个表
fetch_and_print_table(cursor, "Table_A")
fetch_and_print_table(cursor, "Table_B")
fetch_and_print_table(cursor, "Table_C")

cursor.close()
conn.close()

内容的提问来源于stack exchange,提问作者Prem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 06:38:48