从数据库逐个获取结果

2024-05-19 19:18:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个小程序,从数据库(单表)查询结果。我使用的是python3.3、sqlalchemy和postgres数据库。在

result = db_session.query(Data).all()
progress = 0
for row in result:
    update_progress_bar(progress, len(result))
    do_something_with_data(row)
    progress += 1

“result”变量将包含几千行,数据处理需要一些时间。这就是为什么我引入了简单的进度条来告诉你它需要多少时间。 问题是,30%的时间都在数据库(第一行)上。所以当我启动程序时,进度条开始移动之前会有很大的延迟。另外,我不需要把所有的结果都保存在内存中。我可以分开处理。在

有没有什么方法可以修改上面的程序,一行一行地得到,直到所有的行都被接收到,而不把所有的东西都加载到内存中?此外,我还想监视查询和处理数据的进度。在


Tags: 内存进度条程序数据库dbdatasqlalchemysession
1条回答
网友
1楼 · 发布于 2024-05-19 19:18:38

您只需循环查询而不调用.all()call^{}来设置批大小:

for row in db_session.query(Data).yield_per(10):
    do_something_with_data(row)

.all()确实会首先将整个结果集转换为一个列表,如果结果集很大,则会导致延迟。在设置.yield_per()之后直接迭代查询,而不是根据需要获取结果,前提是数据库API支持它。在

如果您想预先知道将返回多少行,请首先调用.count()

^{pr2}$

.count()请求数据库首先为我们提供一个项目计数。在

即使使用.yield_per(),您的数据库仍可能预缓存结果行,从而导致启动延迟。在这种情况下,您需要使用windowed query根据列中的一个中的值范围将查询拆分为块。这是否有效取决于你确切的表格布局。在

相关问题 更多 >