Google AppEngine: как считать записи в базе данных за 1000? - PullRequest
12 голосов
/ 28 апреля 2009

Дубликат "Как получить число строк в модели хранилища данных в Google Appengine?"


Я хочу знать, сколько у меня пользователей. Ранее я добился этого с помощью следующего кода:

users = UserStore.all()
user_count = users.count()

Но теперь у меня более 1000 пользователей, и этот метод продолжает возвращать 1000.

Существует ли эффективный программный способ узнать, сколько у меня пользователей?

Ответы [ 5 ]

14 голосов
/ 28 апреля 2009

Это действительно дубликат, и в другом посте описывается, как это теоретически сделать, но я хотел бы подчеркнуть, что вам не следует делать подсчеты таким образом. Причина в том, что BigTable по своей распределенной природе очень плох для агрегатов. То, что вы, вероятно, хотите сделать, это добавить счетчик транзакций к этой сущности, и, если есть много транзакций, счетчик с сегрегами. Смотри: http://code.google.com/appengine/articles/sharding_counters.html

ОБНОВЛЕНИЕ: так как курсоры 1.3.1 значительно упрощают такие вещи: http://code.google.com/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors

2 голосов
/ 23 августа 2010

Начиная с версии 1.3.6 SDK, предел 1000 для функции подсчета был удален. Таким образом, вызов функции count теперь будет возвращать точное количество объектов, даже если их больше 1000. Единственное ограничение будет, если у вас будет так много объектов, что функция count не вернется до истечения времени ожидания запроса.

2 голосов
/ 28 апреля 2009

Используйте нумерацию страниц, как в этих примерах здесь .

0 голосов
/ 11 октября 2012

Для Python GAE SDK вы можете увеличить аргумент «limit» метода count: https://developers.google.com/appengine/docs/python/datastore/queryclass#Query_count

0 голосов
/ 23 августа 2010

Я написал этот метод для подсчета запросов, но как сказал Ник Джонсон, может быть, это плохая идея ...

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...