Реализация курсора в модели NDB не работает - PullRequest
0 голосов
/ 29 апреля 2020

Модель БД

Привет, Нужен совет о том, как использовать функции курсора в модели NDB. Я могу использовать with_cursor в модели БД, но ее нет в модели NDB:

Модель БД

       def myDBfn(self):                       
             cursor_from_url = self.request.get('cursor')            
             logging.info("Cursor in start is: {}".format(cursor_from_url))             
             process_date = util_misc.get_start_date_from_day_param(self)            
             gql_query_text = 'Select * From DummyTable' 
            #Execute query
            query_o = db.GqlQuery(gql_query_text, process_date)            

            if cursor_from_url:                
                query_o.with_cursor(cursor_from_url)                
                BATCH_SIZE = 500
                results = query_o.fetch(BATCH_SIZE)
            else:                
                BATCH_SIZE = 1                
                results = query_o.fetch(BATCH_SIZE)

            if not results:
                logging.info("pref_email_update_task: all done")
                return                     

            logging.info("Exiting myDBfn....")
        return

Модель NDB

        def myNDBfn(self):          
            cursor_from_url = Cursor(urlsafe=self.request.get('cursor'))                                
            logging.info("Cursor in start is: {}".format(cursor_from_url))                            

            gql_query_text = 'Select * From TestSequences' #Define query conditions here            

            #Execute query            
            query_o = ndb.gql(gql_query_text)            
            if cursor_from_url:       
                query_o.fetch_page(5,start_cursor=cursor_from_url)                
                BATCH_SIZE = 500
                results = query_o.fetch(BATCH_SIZE)
            else:                                
                BATCH_SIZE = 1             
                results = query_o.fetch(BATCH_SIZE)

            if not results:
                logging.info("feed_sequence_update_second_task: all done")
                return                     
            logging.info("result is {}".format(results))   
            logging.info("Exiting myNDBfn....")
        return 

Но в модели NDB этот cursor_from_url выдает ошибку: повышение datastore_errors.BadValueError ('недействительный курсор') Добрый совет! !!!! * * 1013

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

Я нашел исправление, но не уверен, правильно ли он использует курсор в NDB Модель: def feed_sequence_update_alltime (self):

            logging.info("In feed_sequence_update_alltime")           
            cursor_from_url = ndb.Cursor.from_websafe_string(self.request.get('cursor'))                      
            logging.info("Cursor in start is: {}".format(cursor_from_url))                              

            gql_query_text = 'Select * From TestSequences' #Define query conditions here            

            #Execute query            
            query_o = ndb.gql(gql_query_text)            

            if cursor_from_url:
                query_o.fetch_page(20)                                                          
                BATCH_SIZE = 500
                results = query_o.fetch(BATCH_SIZE)                                                
            else:                                                
                BATCH_SIZE = 1              
                results = query_o.fetch(BATCH_SIZE)                

            if not results:
                logging.info("feed_sequence_update_task: all done")
                return

            logging.info("result is {}".format(results))

            #Calling fn to insert data in FeedSequence
            record_type = 'alltime'
            FeedModelCheck.add_feeds_sequences_records(self,results,record_type)

            cursor = query_o.fetch()
            taskqueue.add(url='/admin/feed/add-top-searches-alltime', params={'cursor': cursor})

            logging.info("Exiting feed_sequence_update_alltime")
        return
0 голосов
/ 30 апреля 2020
This is the final code i am using.Please have a look if i am using the taskqueue correctly?  
  def myNDBfn(self):
            logging.info("Entering myNDBfn...")
            urlsafe_cursor = self.request.get('cursor', None)
            cursor_from_url = Cursor(urlsafe=urlsafe_cursor) if urlsafe_cursor else None                      
            logging.info("Cursor in start is: {}".format(cursor_from_url))                            

            gql_query_text = 'Select * From TestSequences' #Define query conditions here 
            #Execute query                        
            query_o = ndb.gql(gql_query_text)
            BATCH_SIZE = 500
            results, next_cursor, more = query_o.fetch_page(BATCH_SIZE, start_cursor=cursor_from_url)

            if more:
               pass
            if next_cursor:
               pass

            if not results:
               logging.info("feed_sequence_update_second_task: all done")
               return

            logging.info(" results is {}".format(results))

            #Calling fn to insert data in FeedSequence
            record_type = 'daily'
            FeedModelCheck.add_feeds_sequences_records(self,results,record_type)      

            cursor = query_o.fetch()
            taskqueue.add(url='/admin/feed/add-top-searches-daily', params={'cursor': cursor})         
            logging.info("Exiting myNDBfn...")
        return 
0 голосов
/ 29 апреля 2020

РЕДАКТИРОВАТЬ - я переписал свой ответ, потому что я неправильно прочитал ваш код.

Во-первых, вы правильно строили курсор. Проблема в том, что вы игнорировали результаты fetch_page()

Я переписал вашу функцию

    def myNDBfn(self):
        urlsafe_cursor = self.request.get('cursor', None)
        cursor_from_url = Cursor(urlsafe=urlsafe_cursor) if urlsafe_cursor else None                      
        logging.info("Cursor in start is: {}".format(cursor_from_url))                            

        gql_query_text = 'Select * From TestSequences' #Define query conditions here            

        #Execute query
        results, next_cursor, more = ndb.gql(gql_query_text).fetch_page(500, start_cursor=cursor_from_url)            

        if not results:
            logging.info("feed_sequence_update_second_task: all done")
            return                     
        logging.info("result is {}".format(results))  
        logging.info("next cursor is {}. urlsafe: {}".format(next_cursor, next_cursor.urlsafe()))   
        logging.info("Exiting myNDBfn....")
    return 
...