Подтвердить что ты не робот

Google AppEngine: как считать записи базы данных за пределами 1000?

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


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

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

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

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

4b9b3361

Ответ 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