как правильно понять курсор

Я пытаюсь применить курсор к своему приложению, однако документ недостаточно ясен для меня. Описание Google для курсора http://code.google.com/appengine/docs/python/datastore/queries.html#Query_Cursors

Позиция курсора определяется как место в списке результатов после возврата последнего результата. Курсор не является относительным положением в списке (это не смещение); это маркер, к которому может перейти хранилище данных при запуске сканирования индекса для получения результатов. Если результаты запроса изменяются между использованиями курсора, запрос замечает только те изменения, которые происходят в результатах после курсора. Если перед позицией курсора для запроса появляется новый результат, он не будет возвращен при извлечении результатов после курсора. Точно так же, если объект больше не является результатом запроса, но появился перед курсором, результаты, которые появляются после курсора, не изменяются. Если последний возвращенный результат удаляется из набора результатов, курсор все еще знает, как найти следующий результат.

Насколько я понимаю, результаты запроса всегда будут возвращаться с порядком по умолчанию (например, __ ключ __). Затем, с указанным курсором, он добавит фильтр для фильтрации всех результатов до этого курсора. Так же, как Google упоминал в прошлом. Это правда?

Пейджинг с ключом __ __ и неуникальным свойством http://code.google.com/appengine/articles/paging.html

Другой вопрос, можно ли использовать курсор с итерацией или задачей? По некоторым причинам эта функция работает некорректно. Обычно он может генерировать «запрос не найден» в процессе итерации.

Это мой пример:

people = Person.all().filter("age > ", 30)
if cursor:
     people.with_cursor(cursor)

try:
     for person in people: # query not found
        cursor = people.cursor()

except DeadlineExceededError:
     taskqueue.add(url="/people", params= {"cursor", cursor})

person lucemia    schedule 02.07.2011    source источник


Ответы (1)


Ваше понимание более или менее верно, но курсор нельзя рассматривать как простое добавление фильтров. Предположим, у вас есть набор результатов, упорядоченный сначала по возрасту, а затем по имени. Если ваш последний возвращенный результат имеет возраст = 30 и имя = Боб, нет набора критериев, который вернет точно результаты после этого - возраст> = 30 и имя> Боб не вернет Алису, которой 31 год.

Курсор больше похож на закладку в вашем наборе результатов. Он обозначает место, где вы остановились, чтобы вы могли вернуться позже. Если набор результатов изменяется до или после курсора, курсор остается на том же месте, поэтому вы всегда продолжите с того места, на котором остановились.

Чтобы ответить на ваши другие вопросы: да, запросы всегда имеют подразумеваемый порядок. Что это такое, зависит от рассматриваемого запроса (в вашем случае это будет сначала по возрасту, а затем по ключу), но это обеспечивает общий порядок результатов. Статья о подкачке, на которую вы ссылаетесь, устарела и обеспечивает предварительный подход к разбивке на страницы. Вы можете игнорировать его в пользу курсоров.

Вы можете передавать курсоры между задачами (и между пользователями) просто отлично. Если вы видите ошибку, вам придется показать нам трассировку стека, прежде чем мы сможем чем-то помочь.

person Nick Johnson    schedule 04.07.2011