我已经在多个位置读过GAE提高了查询和计数的1000记录限制,但是,我似乎只能得到最多1000个记录的计数。我不会在超过1000个查询一段时间,但要求是我需要计算匹配记录。
据我所知,你可以使用游标通过数据集“分页”,但循环只是为了得到一个计数似乎有点多。大概是当他们说他们“提升”了限制时,这是一个硬限制 - 你仍然需要一次循环1000个结果,我是否正确?
我是否应该使用除.all()/ filter方法之外的方法来生成1000多个计数?
提前感谢您的帮助!
答案 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。