如何获取超过1000个?

52 投票
16 回答
33789 浏览
提问于 2025-04-11 18:25

我该怎么做才能从数据存储中获取超过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

从版本1.3.6开始(发布于2010年8月17日),你可以

根据更新日志:

数据存储的count()查询结果以及所有数据存储查询的偏移量不再限制在1000

撰写回答