我正在使用适配器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)
失败 - 与上述相同的错误
答案 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