Как получить более 1000? - PullRequest
       18

Как получить более 1000?

48 голосов
/ 05 ноября 2008

Как я могу получить более 1000 записей из хранилища данных и поместить все в один список для передачи в django?

Ответы [ 16 ]

2 голосов
/ 25 сентября 2009
class Count(object):
def getCount(self,cls):
    class Count(object):
def getCount(self,cls):
    """
    Count *all* of the rows (without maxing out at 1000)
    """
    count = 0
    query = cls.all().order('__key__')


    while 1:
        current_count = query.count()
        count += current_count
        if current_count == 0:
            break

        last_key = query.fetch(1, current_count-1)[0].key()
        query = query.filter('__key__ > ', last_key)

    return count
1 голос
/ 27 августа 2009

JJG: ваше решение выше, отличное, за исключением того, что оно вызывает бесконечный цикл, если у вас 0 записей. (Я узнал об этом во время тестирования некоторых моих отчетов локально).

Я изменил начало цикла while, чтобы он выглядел так:

while count % 1000 == 0:
    current_count = query.count()
    if current_count == 0:
        break
0 голосов
/ 08 февраля 2016

Если вы используете NDB:

@staticmethod
def _iterate_table(table, chunk_size=200):
    offset = 0
    while True:
        results = table.query().order(table.key).fetch(chunk_size + 1, offset=offset)
        if not results:
            break
        for result in results[:chunk_size]:
            yield result
        if len(results) < chunk_size + 1:
            break
        offset += chunk_size
0 голосов
/ 16 марта 2011

Это близко к решению, предоставленному Габриэлем, но не извлекает результаты, оно просто считает их:

count = 0
q = YourEntityClass.all().filter('myval = ', 2)
countBatch = q.count()
while countBatch > 0:
    count += countBatch
    countBatch = q.with_cursor(q.cursor()).count()

logging.info('Count=%d' % count)

Отлично работает для моих запросов и быстро (1,1 секунды для подсчета 67 000 объектов)

Обратите внимание, что запрос не должен быть фильтром неравенства или набором, иначе курсор не будет работать, и вы получите это исключение:

AssertionError: курсор недоступен для MultiQuery (запросы с использованием операторов "IN" или "! =")

0 голосов
/ 16 июня 2009

Предлагаемое решение работает только в том случае, если записи сортируются по ключу ... Если вы сначала сортируете по другому столбцу, вам все равно нужно использовать предложение limit (offset, count), тогда ограничение 1000 записей по-прежнему применяется. То же самое, если вы используете два запроса: один для получения индексов (с условиями и сортировкой), а другой - с использованием где index in () с подмножеством индексов из первого результата, так как первый запрос не может вернуть более 1000 ключей? (В разделе Google Запросы по ключам четко не указано, нужно ли сортировать по ключу key , чтобы снять ограничение в 1000 результатов)

0 голосов
/ 05 ноября 2008

Чтобы сложить вместе два запроса:

list1 = first query
list2 = second query
list1 += list2

Список 1 теперь содержит все результаты 2000 года.

...