как правильно понимать "курсор" - PullRequest
3 голосов
/ 02 июля 2011

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

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

В моем понимании, результаты запроса всегда будут возвращаться с порядком по умолчанию (например, __ key __). Затем, с указанным курсором, он добавит фильтр, чтобы отфильтровать все результаты перед этим курсором. Так же, как 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})

1 Ответ

3 голосов
/ 04 июля 2011

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

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

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

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

...