Как определить, является ли возвращаемый курсор последним курсором в App Engine

Я прошу прощения, если мне не хватает чего-то действительно очевидного.

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

Есть ли лучший способ сделать это?

Спасибо!

Ответ 1

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

Ответ 2

Я не думаю, что есть способ сделать это с помощью ext.db в одном вызове datastore, но с ndb это возможное. Пример:

query = Person.query(Person.name == 'Guido')
result, cursor, more = query.fetch_page(10)

Если использование возвращаемого курсора приведет к большему количеству записей, more будет True. Это выполняется с умом, в одном вызове RPC.

Ответ 3

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

В этом случае вы знаете, что находитесь на последнем курсоре, когда у вас меньше результатов, чем ваш лимит.

limit = 100
results = Entity.all().with_cursor('x').fetch(limit)
if len(results)<limit:
    # then there no point trying to fetch another batch after this one

Ответ 4

Я использую тот же метод, который описывает Крис Фамило, но установил предел 1 больше, чем я хочу вернуться. Итак, в примере Криса я бы взял 101 объект. 101 вернулся означает, что у меня есть другая страница с по крайней мере 1 на.

    recs = db_query.fetch(limit + 1, offset)

    # if less records returned than requested, we've reached the end
    if len(recs) < limit + 1:
        lastpage = True
        entries = recs
    else:
        lastpage = False
        entries = recs[:-1]

Ответ 5

Я знаю, что этот пост старый, но я искал решение той же проблемы. Я нашел это в этой замечательной книге:

http://shop.oreilly.com/product/0636920017547.do

Вот совет:

    results = query.fetch(RESULTS_FOR_PAGE)

    new_cursor = query.cursor()
    query.with_cursor(new_cursor)
    has_more_results = query.count(1) == 1