pg8000和cursor.fetchall()在适中记录数时无法返回记录

1 投票
2 回答
5512 浏览
提问于 2025-04-18 15:55

我正在使用适配器 pg8000 从我的数据库中读取记录,代码如下:

cursor = conn.cursor()
results = cursor.execute("SELECT * from data_" + country + " WHERE date >= %s AND date <= %s AND time >= %s AND time <= %s", (datetime.date(fromdate[0], fromdate[1], fromdate[2]), datetime.date(todate[0], todate[1], todate[2]),datetime.time(fromtime[0],fromtime[1]), datetime.time(totime[0],totime[1])))
results = cursor.fetchall()

问题出现在我选择一个日期范围时,这个范围大概会返回100条记录。虽然这个数字不算太多,但足够引发以下问题,我找不到问题的来源,因为它似乎与返回的记录数量有关。例如:results = cursor.fetchall() 这行代码看起来运行得很好,能返回一个结果。

我收到的错误信息是:

File "/mnt/opt/Centos5.8/python-2.7.8/lib/python2.7/site-packages/pg8000/core.py", line 1650, in handle_messages
    raise error
pg8000.errors.ProgrammingError: ('ERROR', '34000', 'portal "pg8000_portal_0" does not exist')

显然,我尽管进行了探索,但还是找不到解决办法。

当我使用 fetchmany() 时,结果如下:

results = cursor.fetchmany(100) 成功 - 限制为100条记录

results = cursor.fetchmany(101) 失败 - 出现和之前一样的错误

2 个回答

-1

看起来这个问题可以通过设置以下内容来解决:

conn.autocommit = False

现在代码看起来是这样的:

conn.autocommit = False
cursor = conn.cursor()
results = cursor.execute("SELECT * from data_" + country + " WHERE date >= %s AND date <= %s AND time >= %s AND time <= %s", (datetime.date(fromdate[0], fromdate[1], fromdate[2]), datetime.date(todate[0], todate[1], todate[2]),datetime.time(fromtime[0],fromtime[1]), datetime.time(totime[0],totime[1])))
results = cursor.fetchall()

我不太明白为什么会这样,但似乎在自动提交设置为 True 的情况下,记录的数量限制在100条。

7

在自动提交模式下,你不能获取超过pg8000缓存所能容纳的行数(默认是100行)。

我已经做了一次更新,这样当发生这种情况时,会给出更清晰的错误提示,这个更新会在pg8000的下一个版本中推出。

原因是,如果查询返回的行数超过了pg8000缓存的行数,数据库的门户会保持打开状态,然后当缓存为空时,会从门户中获取更多的行。一个门户只能在一个事务中存在,所以在自动提交模式下,第一次获取行后,门户会立即关闭。如果你尝试从门户中获取第二批行,就会出现“门户不存在”的错误,这就是问题中提到的情况。

撰写回答