chr*_*kso 5 python caching sqlalchemy flask flask-sqlalchemy
我正在寻找类似于 reddit/hackernews 具体如何处理其“新”列表的内容(这似乎是许多主要网站的常见方法)。它看起来像这样工作:
我的问题是:很难找到 SQLalchemy/flask-sqlalchemy 代码来获取仅固定数量的最新条目的查询。
我怎么说:
q = PostDB.query(order_by('creation_time').desc()).limit(1000)
for chunkOf50Results in q:
cache.set(CachedChunk+=1, chunkOf50Results)
Run Code Online (Sandbox Code Playgroud)
?
如果您在 SQLAlchemy 中对查询进行切片,它会自动限制获取的数据库结果集:
limitedQuery = q[:50]
Run Code Online (Sandbox Code Playgroud)
如果您要先获得计数,则可以轻松地循环分块响应:
count = q.count()
for chunkstart in xrange(0, count, 50):
CachedChunk += 1
chunkend = min(chunkstart + 50, count)
cache.set(CachedChunk, q[chunstart:chunkend])
Run Code Online (Sandbox Code Playgroud)
请注意,这确实会导致对数据库进行多次查询。或者,您可以使用函数itertools.izip_longest()来生成 50 个项目的组:
from itertools import izip_longest
for chunkOf50Results in izip(*[q.yield_per(50)]*50):
CachedChunk += 1
cache.set(CachedChunk, chunkOf50Results)
Run Code Online (Sandbox Code Playgroud)
我用了.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)]
Run Code Online (Sandbox Code Playgroud)
请注意,最后一个批次会填充None值以填充批次大小。