Google AppEngine: как считать записи базы данных за пределами 1000?
Дубликат как получить количество строк в модели хранилища данных в Google appengine?
Я хочу знать, сколько у меня пользователей. Раньше я достигал этого со следующим кодом:
users = UserStore.all()
user_count = users.count()
Но теперь у меня более 1000 пользователей, и этот метод продолжает возвращать 1000.
Существует ли эффективный программный способ узнать, сколько у меня пользователей?
Ответы
Ответ 1
Это действительно дубликат, а другой пост описывает, как теоретически это делать, но я хотел бы подчеркнуть, что вы действительно не должны делать так. Причина в том, что BigTable по распределенной природе действительно плохо для агрегатов. То, что вы, вероятно, хотите сделать, это добавить транзакционный счетчик к этому объекту, а если есть много транзакций, то счетчик. См.: http://code.google.com/appengine/articles/sharding_counters.html
UPDATE: поскольку курсоры 1.3.1 делают такие вещи намного проще: http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors
Ответ 2
Используйте разбиение на страницы, подобные этим примерам здесь.
Ответ 3
Поскольку версия 1.3.6 SDK, предел 1000 в функции count был удален. Таким образом, вызов функции count теперь вернет точное количество объектов, даже если их больше 1000. Ограничение будет только в том случае, если у вас было так много объектов, что функция count не вернется до того, как запрос имеет таймаут.
Ответ 4
Я написал этот метод для подсчета запроса, но как сказал Ник Джонсон, может быть, это плохая идея...
def query_counter (q, cursor=None, limit=500):
if cursor:
q.with_cursor (cursor)
count = q.count (limit=limit)
if count == limit:
return count + query_counter (q, q.cursor (), limit=limit)
return count
Ответ 5
Для Python GAE SDK вы можете увеличить аргумент "limit" метода count:
https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_count