курсор и with_cursor () в GAE - PullRequest
0 голосов
/ 01 марта 2012

Я извлекаю записи из модели gae, используя логику cursor () и with_cursor (), используемую в подкачке страниц.но я не уверен, как проверить, что в БД нет другой записи, на которую указывает курсор.Я получаю эти записи в виде кусков в течение нескольких итераций. Когда я получил требуемые результаты в первой итерации, а затем в следующей итерации, я хочу проверить, что в модели нет записей, но я не получаю пустое / нулевое значение курсора на этом этапеПожалуйста, дайте мне знать, как выполнить эту проверку с помощью курсоров в google app engine с python.

Ответы [ 3 ]

1 голос
/ 02 марта 2012

Если ваша модель расширяет ndb, вы должны использовать fetch_page (). Если это не расширение ndb, вы можете рассмотреть возможность изменения. Он не полностью обратно совместим, но данные не нужно переносить.

from google.appengine.ext.ndb import model

class User(model.Model):
   name = model.StringProperty()

users, cursor, more = User.query(User.name == "Jon").fetch_page(25)

if more: 
    # Do next page logic
    next_users = User.query(User.name == "Jon").fetch_page(25, start_cursor=cursor)
0 голосов
/ 02 марта 2012

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

Чтобы продемонстрировать идею: я использую эту функцию для передачи данных между App Engine и электронной таблицей Google Apps.Перевод осуществляется в страницах;Эта функция пытается оптимизировать размер страницы.args ['Cursor'] удерживает курсор.Первый раз args ['курсор'] = Нет.args ['Page'] содержит размер страницы.Запрос может быть что-то вроде: query = aLotofData.all ()

def makePage(args, proces, query):

    if args['Cursor'] != 'NONE' : query.with_cursor(args['Cursor'])  # next page with cursor

    page = []                                                   # transfer the selected entities in pages
    lines = 0                                                   # lines per page counter
    fetch = int(args['Page'])                                   # fetch can vary; because we optimize the page transfer 
    while lines < 0.8 * int(args['Page']) :                     # optimize pagination when page less than 80% filled
        count = 0                                               # number of entities processed per fetch
        for entity in query.fetch(fetch) :
            count += 1
            page_line = proces(entity)
            if page_line :           
                page.append(page_line)                          # variable function call to preces the entity
                lines += 1
        if count < fetch :                                      # no more entities ?
            cursor = 'NONE'                                     # last page, no cursor 
            break
        cursor = query.cursor()                                 # save current cursor fot he next run                
        query.with_cursor(cursor)                               # set the cursor for the fetch iteration (optimize)
        fetch = int(args['Page']) - lines                       # and fetch the number of page lines left to fill

    logging.debug('Transfered : %d next_cursor : %s' %(lines, cursor)) 

    return simplejson.dumps({'cursor' : cursor, 'page' : page})

Функция «обрабатывать» обрабатывает каждую сущность.Когда процесс возвращает None, строка не добавляется к текущей странице.

0 голосов
/ 01 марта 2012

Я не уверен на 100% в этом, но то, что я делал, это сравнивал последний курсор с фактическим курсором, и я думаю, что заметил, что они были одинаковыми, поэтому я пришел к выводу, что это был последний курсор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...