Как работают курсоры appengine?


Я использую оба запроса ndb и search-api в моем проекте python appengine.

Единственные официальные документы по курсорам, которые я могу найти:

Для меня неясны следующие вещи:

  1. Что такое cursor time-to-live ? Могу ли я выставить годовалые курсоры ?
  2. Как бы выглядела разбиение курсора на страницы как вести себя в случае добавления/удаления элементов из исходной коллекции? (+если курсор указывает на конкретную запись, что произойдет, если эта запись больше не существует?)
  3. Как влияет порядок запросов выше?
  4. существуют ли какие-либо фундаментальные различия между курсорами ndb и search-api?
1 7

1 ответ:

Я отвечаю с точки зрения ndb, я не использовал API поиска. Все цитаты взяты из вашей первой ссылки.

Для 1 и 3 (поскольку упорядочивание рассматривается как часть исходного запроса с точки зрения курсоров):

Чтобы получить дополнительные результаты из точки курсора, приложение готовит аналогичный запрос с тем же типом сущности, фильтрует, сортирует заказы и передает курсор на запрос. метод with_cursor () перед выполнением получение

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

Для 2:

Курсоры и обновления данных

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

При получении результатов запроса можно использовать как начальный курсор, так и конец курсора для возврата непрерывной группы результатов из облака Хранилище данных. При использовании начального и конечного курсоров для получения результатов, вы не гарантируете, что размер результатов будет таким же как тогда, когда вы создали курсоры. Объекты могут быть добавлены или удалены из облачного хранилища данных между временем генерируются курсоры и когда они используются в запросе.

Эквивалентная страница Java в ограничения курсоров упоминает некоторые ошибки, которые могут быть подняты для несоответствий:

Новые версии движка приложений могут изменить внутренние детали реализации, обесценивание курсоров, зависящих от них. Если приложение пытается чтобы использовать курсор, который больше не является допустимым, облачное хранилище данных создает IllegalArgumentException (низкоуровневый API), JDOFatalUserException (JDO), или PersistenceException (JPA).

Я подозреваю, что Python также вызовет некоторые подобные ошибки.