python - 如何使用 Flask/SQLAlchemy 将返回结果的数量限制为仅 1000 个最新条目?

标签 python caching sqlalchemy flask flask-sqlalchemy

我正在寻找类似于 reddit/hackernews 的具体方式(这似乎是许多主要网站的常用方法)处理其"new"列表的方式。它似乎是这样工作的:

  • 提交新链接时,抓取一定数量的最新条目
  • 这些查询按 PER_PAGE # 划分并缓存为 cachekey = newestPage1,2,3,4
  • 点击下一个/上一个按钮加载下一个/上一个缓存键

我的问题是:很难找到 SQLalchemy/flask-sqlalchemy 代码来查询固定数量的最新条目。

怎么说:

q = PostDB.query(order_by('creation_time').desc()).limit(1000)
for chunkOf50Results in q:
  cache.set(CachedChunk+=1, chunkOf50Results)

?

最佳答案

如果您在 SQLAlchemy 中对查询进行切片,它会自动限制获取的数据库结果集:

limitedQuery = q[:50]

如果您要先进行计数,则可以轻松地遍历分块响应:

count = q.count()
for chunkstart in xrange(0, count, 50):
    CachedChunk += 1
    chunkend = min(chunkstart + 50, count)
    cache.set(CachedChunk, q[chunstart:chunkend])

请注意,这确实会导致对数据库进行多次查询。或者,您可以使用 itertools.izip_longest() function生成 50 个项目的组:

from itertools import izip_longest

for chunkOf50Results in izip(*[q.yield_per(50)]*50):
     CachedChunk += 1
     cache.set(CachedChunk, chunkOf50Results)

我用了.yield_per(50)将行预取限制为批大小,这样您就不会预取超过每批所需的数量。

izip_longest(*[iterable]*n) 技巧为您提供了基迭代器中大小为 n 的组:

>>> import itertools
>>> list(itertools.izip_longest(*[iter(range(7))]*3))
[(0, 1, 2), (3, 4, 5), (6, None, None)]

请注意,最后一批填充了 None 值以填充到批大小。

关于python - 如何使用 Flask/SQLAlchemy 将返回结果的数量限制为仅 1000 个最新条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12111925/

相关文章:

python - Django - FloatField 中不允许 NaN 和无穷大

python - 绘制具有 7 个特征的 Scikit Logistic 回归的决策边界

php - 如何缓存基于位置的数据库查询?

python - SQLAlchemy 子查询 - 总和的平均值

mysql - sqlalchemy 中的随机 ID( Pylons )

python - SQLAlchemy 双向关系关联代理

python - 在python中执行存储过程

python - 将 json 文件导入 Django 模型

caching - 从并发可访问的结构中检索数据类型后,哪些数据类型可以安全地读取和写入?

android - 使用 RxJava 缓存网络调用一段时间