Курсор запроса для движка приложения в Python с использованием итератора запросов

Я хочу использовать нумерацию страниц, а не по телефону,

greets, next_curs, more = Greeting.query().fetch_page(10, start_cursor=curs)

но с помощью итераторов запросов. Потому что таким образом я могу использовать тасклеты для объединения всех последовательных "получений", как описано в https://developers.google.com/appengine/docs/python/ndb/async#tasklets

Теперь в моем коде все выглядит так:

class Book(ndb.Model):
    author = ndb.KeyProperty('a', kind=User, required=True)

author_key = ndb.Key(urlsafe=user_id)
books_query=Book.query(Book.author == author_key)
@ndb.tasklet
def callback(book):
     author = yield book.author.get_async()
     raise ndb.Return(book, author)

q_option = {'limit' : 2, 'produce_cursors' : True }
outputs = books_query.map(callback, **q_option)

Не знаю, где что-то идет не так, но если я попытаюсь это сделать,

books_query.iter().cursor_before() 

or

books_query.iter().cursor_after()

Это не удается со следующей трассировкой,

raise datastore_errors.BadArgumentError('There is no cursor currently')
BadArgumentError: There is no cursor currently

Любой сложный пример использования итераторов запросов и тасклетов с курсорами был бы действительно полезен, чтобы понять это.


person Harshal Patil    schedule 14.01.2014    source источник
comment
Я подозреваю, что ваша функция карты как-то связана с этим. developers.google.com/appengine/docs/python/ ndb /   -  person Jimmy Kane    schedule 14.01.2014
comment
@JimmyKane У меня тоже такое чувство, но я не могу указать на что-то конкретное, что вызывает проблему.   -  person Harshal Patil    schedule 14.01.2014
comment
Ваша проблема не в функции карты. Вы нигде не построили курсор. Вот почему вы получаете сообщение «В настоящее время нет курсора». Вызов map () поддерживает все параметры запроса, включая курсор.   -  person Tim Hoffman    schedule 15.01.2014
comment
@TimHoffman Я не уверен, нужно ли мне создавать курсор для самой первой страницы, которую я пытаюсь получить. Разве этот api не должен быть достаточно умным, чтобы знать, что если вы получите «None» в качестве «start_cursor», он должен просто получить результаты, указанные в «limit», и сгенерировать курсор для второй страницы?   -  person Harshal Patil    schedule 15.01.2014
comment
Нет, потому что вам может не нужен / не нужен курсор. Следуйте примерам использования курсоров и создайте один и укажите его при создании запроса.   -  person Tim Hoffman    schedule 15.01.2014


Ответы (1)


books_query.iter().cursor_after() полагается на .iter(**q_options), который создает QueryIterator со своими собственными параметрами.

Проблема в том, что нет возможности получить доступ к внутреннему итератору, используемому .map().

См. Ответ Гвидо на связанный вопрос по теме: https://stackoverflow.com/a/14150081/2380615

person Josh    schedule 31.01.2014