编辑:使用 fetchmany(连同 fetchone() 和 fetchall(),即使有行限制(arraysize)仍将发送整个结果集,将其保留在客户端(存储在底层 c 库中,我认为是 libpq)用于任何其他fetchmany() 调用等。如果不使用命名游标(这将需要打开事务),您必须在 sql 中使用 limit 和 order-by,然后分析结果并使用以下命令扩充下一个查询where (ordered_val = %(last_seen_val)s and primary_key > %(last_seen_pk)s OR ordered_val > %(last_seen_val)s)
至少可以说,这对图书馆来说是一种误导,并且文档中应该对此有一个简介。我不知道为什么它不在那里。
不确定命名光标是否适合而不需要交互地向前/向后滚动?我在这里可能是错的。
循环很乏味,fetchmany
但我认为这是最好的解决方案。为了让生活更轻松,您可以使用以下内容:
from functools import partial
from itertools import chain
# from_iterable added >= python 2.7
from_iterable = chain.from_iterable
# util function
def run_and_iterate(curs, sql, parms=None, chunksize=1000):
if parms is None:
curs.execute(sql)
else:
curs.execute(sql, parms)
chunks_until_empty = iter(partial(fetchmany, chunksize), [])
return from_iterable(chunks_until_empty)
# example scenario
for row in run_and_iterate(cur, 'select * from waffles_table where num_waffles > %s', (10,)):
print 'lots of waffles: %s' % (row,)