如何获取超过1000个?
我该怎么做才能从数据存储中获取超过1000条记录,并把它们放到一个列表里,然后传给Django呢?
16 个回答
19
App Engine 提供了一种很方便的方法,可以通过每次获取 1000 条结果来“分页”,具体做法是根据键(Keys)进行排序,然后用最后一个键作为下一个查询的起点。他们还提供了一些示例代码,可以参考这里:
http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Queries_on_Keys
虽然他们的示例是把查询分散到多个请求中,但你可以把每页的大小从 20 改成 1000,然后在一个循环中查询,合并这些查询结果。此外,你还可以使用 itertools 来连接这些查询,而不需要在它们被使用之前就计算出结果。
例如,想要计算超过 1000 行的数据:
class MyModel(db.Expando):
@classmethod
def count_all(cls):
"""
Count *all* of the rows (without maxing out at 1000)
"""
count = 0
query = cls.all().order('__key__')
while count % 1000 == 0:
current_count = query.count()
if current_count == 0:
break
count += current_count
if current_count == 1000:
last_key = query.fetch(1, 999)[0].key()
query = query.filter('__key__ > ', last_key)
return count
23
顺便说一下,现在不再有1000条记录的限制了:
http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html
引用内容:
不再有1000条结果的限制了——没错!因为新增了光标(Cursors)功能,并且在过去几个月里进行了许多小的数据库稳定性和性能改进,我们现在有信心完全取消这个最大结果限制。无论你是获取数据、遍历数据,还是使用光标,都没有结果数量的限制。
38