如果记录数量适中,pg8000和cursor.fetchall()无法返回记录

时间:2014-08-04 14:24:00

标签: python sql postgresql pg8000

我正在使用适配器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 个答案:

答案 0 :(得分:4)

在自动提交模式下,您无法检索比pg8000缓存保留的行数更多的行(默认情况下为100)。

made a commit会在发生这种情况时提供更好的错误消息,这将在pg8000的下一个版本中发布。

原因是如果查询返回的行数大于pg8000缓存中的行数,则数据库门户保持打开状态,然后当缓存为空时,从门户网站获取更多行。门户网站只能存在于事务中,因此在自动提交模式下,在检索到第一批行后立即关闭门户网站。如果您尝试从门户网站检索第二批,则会在问题中报告“门户网站不存在”错误。

答案 1 :(得分:-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

的记录数似乎有限制