Google App Engine - 获取超过1000条标准的记录数

时间:2010-09-26 19:03:54

标签: google-app-engine google-cloud-datastore

我已经在多个位置读过GAE提高了查询和计数的1000记录限制,但是,我似乎只能得到最多1000个记录的计数。我不会在超过1000个查询一段时间,但要求是我需要计算匹配记录。

据我所知,你可以使用游标通过数据集“分页”,但循环只是为了得到一个计数似乎有点多。大概是当他们说他们“提升”了限制时,这是一个硬限制 - 你仍然需要一次循环1000个结果,我是否正确?

我是否应该使用除.all()/ filter方法之外的方法来生成1000多个计数?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:7)

当没有明确指定限制时,Query.count()的行为与文档不一致 - 文档表明它将计数“直到它完成计数或超时”。 GAE Issue 3671报告了此错误(大约3周前)。

解决方法:明确指定限制,然后使用该值(而不是默认值1,000)。

http://shell.appspot.com上的测试证明了这一点:

# insert 1500 TestModel entites ...
# ...
>>> TestModel.all(keys_only=True).count()
1000L
>>> TestModel.all(keys_only=True).count(10000)
1500L

我也使用这个简单的测试应用程序在最新版本的开发服务器(1.3.7)上看到了相同的行为:

from google.appengine.ext import webapp, db
from google.appengine.ext.webapp.util import run_wsgi_app

class Blah(db.Model): pass

class MainPage(webapp.RequestHandler):
    def get(self):
        for i in xrange(3):
            db.put([Blah() for i in xrange(500)])  # can only put 500 at a time ...
        c = Blah.all().count()
        c10k = Blah.all().count(10000)
        self.response.out.write('%d %d' % (c,c10k))
        # prints "1000 1500" on its first run

application = webapp.WSGIApplication([('/', MainPage)])

def main(): run_wsgi_app(application)
if __name__ == '__main__': main()

答案 1 :(得分:1)

正如Issue 3671中所建议的那样,如果要计算所有记录,可以将限制设置为无(而不是高于1000的数字,这对于计算上限仍然有用),尽管不建议这样做这反而使事务中的计数非规范化。

total_records = query.count(limit=None)

答案 2 :(得分:-1)

根据此App Engine blog post,版本1.3.6中的count(和offset)刚刚删除了1000实体限制。自版本1.3.1起,fetch的限制已被删除。升级到最新版本,应删除限制。

您不需要一次循环1000个结果(尽管可以,甚至可能更有效);只需传递您想要的最大结果数量:

    for m in MyModel.all().fetch(82000):
        # ...

在1.3.1之前的版本中,中传递的数字小于或等于1000。

相关问题