Google App Engine - получение количества записей, соответствующих критериям более 1000 - PullRequest
5 голосов
/ 26 сентября 2010

Я читал во многих местах, что GAE поднял ограничение на 1000 записей для запросов и подсчетов, однако, я могу только получить счетчик записей до 1000. Я не буду тянуть более 1000 запросов ввремя, но требования таковы, что мне нужно количество совпадающих записей.

Я понимаю, что вы можете использовать курсоры для "разбивки на страницы" набора данных, но циклически проходить, чтобы получить счет, кажется немногомного.Предположительно, когда они сказали, что «сняли» лимит, это был жесткий лимит - вам все еще нужно циклически просматривать результаты по 1000 за раз, я прав?

Должен ли я использовать метод, отличный от.метод all () / filter для генерации числа 1000+?

Заранее благодарим за помощь!

Ответы [ 3 ]

7 голосов
/ 26 сентября 2010

Поведение Query.count() не согласуется с документацией, если явно не указано ограничение - документация указывает, что он будет считать «до тех пор, пока не закончится счет или не истечет время ожидания». GAE Issue 3671 сообщил об этой ошибке (около 3 недель назад).

Обходной путь : явно укажите предел, и тогда будет использоваться это значение (вместо значения по умолчанию 1000).

Тестирование на 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 голос
/ 23 марта 2012

Как предложено в Выпуск 3671 , вы можете установить ограничение на Нет (вместо числа больше 1000, которое все еще полезно для ограничения количества), если вы хотите считать все записи, хотя это не так Рекомендуется сделать это и вместо этого денормализовать счет в транзакциях.

total_records = query.count(limit=None)
0 голосов
/ 26 сентября 2010

Согласно этому сообщению в блоге App Engine , ограничение в 1000 сущностей было только что удалено для countoffset) в версии 1.3.6.Лимит уже был снят для fetch с версии 1.3.1 .Обновитесь до последней версии, и ограничение должно быть снято.

Вам не нужно циклически просматривать результаты по 1000 за раз (хотя вы могли бы, и это может быть даже более эффективно);просто введите максимальное количество результатов, которые вы хотели бы вернуть:

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

В версиях до 1.3.1 число, переданное в , имело , которое должно быть меньше или равно 1000.

...