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

使用PyGreSQL报错pg.DatabaseError:上次查询未返回元组求助

解决pg.DatabaseError: Last query did not return tuples问题

我之前用PyGreSQL处理大表分页的时候也碰到过这个错误,给你梳理下几个常见的排查方向和解决办法:

1. 先确认你的查询语句是否真的返回行

这个错误最直接的原因是执行的SQL没有返回结果集。你可以先在psql或者其他PostgreSQL客户端里手动执行传入的query:

  • 如果是INSERT/UPDATE/DELETE这类DML语句(本来就不返回行),那肯定会触发这个错误——你得确保传给GetMultipleRowsGenerator的是SELECT类的查询语句。
  • 如果是SELECT但返回0行,那你需要检查查询条件是否正确,或者表中是否真的有符合条件的数据。

2. 修复生成器工具函数的空结果处理逻辑

大概率是pgsqlUtils.dbGetMultipleRowsGenerator这个自定义函数没有处理“查询无结果”的情况。PyGreSQL的游标如果执行了不返回行的语句,cursor.description会是None,你可以在生成器里先做判断,避免后续调用fetchmany()时出错。

修改后的工具函数示例:

def dbGetMultipleRowsGenerator(db_conn, query, page_size=1000):
    cursor = db_conn.cursor()
    try:
        cursor.execute(query)
        # 先判断是否有结果集返回
        if not cursor.description:
            yield from ()  # 返回空生成器,优雅退出
            return
        # 分页获取数据
        while True:
            rows = cursor.fetchmany(page_size)
            if not rows:
                break
            yield from rows
    finally:
        cursor.close()

3. 检查DbHelper中的连接与事务处理

你的GetMultipleRowsGenerator里用到了_condition锁和VerifyConnection(),要确保:

  • VerifyConnection()没有重置连接导致查询上下文丢失;
  • 事务状态正常,没有因为之前的异常导致连接处于错误状态;
  • 可以在try块里添加异常捕获,更清晰地定位问题,比如:
def GetMultipleRowsGenerator(self, query, page_size=None):
    """执行查询并返回用于获取行的生成器"""
    if self._condition:
        self._condition.acquire()
    try:
        self.VerifyConnection()
        cursor = self._dbConnection.cursor()
        try:
            cursor.execute(query)
            if not cursor.description:
                yield from ()
                return
            page_size = page_size or 1000
            while True:
                rows = cursor.fetchmany(page_size)
                if not rows:
                    break
                yield from rows
        finally:
            cursor.close()
    except pg.DatabaseError as e:
        # 这里可以添加日志记录,方便排查
        print(f"查询执行出错: {e}")
        raise
    finally:
        if self._condition:
            self._condition.release()

4. 处理分页边界情况

如果你的分页是用LIMIT/OFFSET实现的,当OFFSET超过表的总行数时,查询会返回0行。这时候生成器需要能优雅处理这种情况,而不是抛出异常——上面的代码已经覆盖了这个场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:30:52