Как мне узнать, является ли возвращенный курсор последним курсором в App Engine? - PullRequest
10 голосов
/ 04 августа 2011

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

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

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

Спасибо!

Ответы [ 5 ]

19 голосов
/ 04 августа 2011

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

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

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

6 голосов
/ 04 августа 2011

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

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

limit = 100
results = Entity.all().with_cursor('x').fetch(limit)
if len(results)<limit:
    # then there's no point trying to fetch another batch after this one
5 голосов
/ 04 августа 2011

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

1 голос
/ 10 июля 2012

Я использую ту же технику, которую описывает Крис Фамилоэ, но установил предел 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]
0 голосов
/ 24 марта 2013

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

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
...