我使用适配器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)
WORKS -限制为100
results = cursor.fetchmany(101)
FAILS -与上面相同的错误
在自动提交模式下,您不能检索超过pg8000缓存保存的行(默认为100行)。
当这种情况发生时,我已经提交了一个更好的错误消息,这将在pg8000的下一个版本中。
原因是,如果查询返回的行数大于pg8000缓存中的行数,则数据库门户保持打开状态,然后当缓存为空时,从门户获取更多行。门户只能存在于事务中,因此在自动提交模式下,在检索到第一批行后,门户将立即关闭。如果您尝试从门户检索第二个批处理,则会得到问题中报告的'portal does not exist'错误。
这似乎可以通过设置:
来解决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()
我不知道为什么会出现这种情况-但似乎有100条记录的数量限制与自动提交设置为True