pg8000和cursor.fetchall()在适中记录数时无法返回记录
我正在使用适配器 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缓存的行数,数据库的门户会保持打开状态,然后当缓存为空时,会从门户中获取更多的行。一个门户只能在一个事务中存在,所以在自动提交模式下,第一次获取行后,门户会立即关闭。如果你尝试从门户中获取第二批行,就会出现“门户不存在”的错误,这就是问题中提到的情况。