Получение 100 результатов за раз в Google App Engine
Я надеялся, что кто-нибудь сможет объяснить мне, как использовать смещения или курсоры в App Engine. я использую gcloud
к объектам удаленного доступа для огромной миграции данных, и хотел бы получить данные в пакетах по 100.
Я предполагаю, что есть очень простой способ сделать это, но документация не слишком погружается в курсоры. Вот что у меня так далеко:
client = datastore.Client(dataset_id=projectID)
# retrieve 100 Articles
query = client.query(kind='Article').fetch(100)
for article in query:
print article
Как я могу отметить конец этой партии из 100, а затем перейти к следующей? Спасибо!
Редактировать:
Я должен отметить, что у меня нет доступа к среде движка приложения, поэтому я немного растерялся в данный момент...:(
1 ответ
У меня нет опыта работы с gcloud, но я не думаю, что это должно быть слишком по-другому.
Когда вы делаете запрос, вы будете использовать fetch_page вместо функции fetch. Функция fetch_page возвращает три вещи (результаты, курсор, больше). Курсор - это ваша закладка для запроса, и больше это верно, если есть, вероятно, больше результатов.
После того, как вы обработали свои 100 сущностей, вы можете передать курсор в форме urlsafe на URI вашего обработчика запросов, где вы продолжите процесс, начиная с нового курсора.
from google.appengine.datastore.datastore_query import Cursor
class printArticles(webapp2.RequestHandler):
def post(self):
query = Client.query()
#Retrieve the cursor.
curs = Cursor(urlsafe=self.request.get('cursor'))
#fetch_page returns three things
articles, next_curs, more = query.fetch_page(100, start_cursor=curs)
#do whatever you need to do
for article in articles:
print article
#If there are more results to fetch
if more == True and next_curs is not None:
#then pass along the cursor
self.redirect("/job_URI?cursor=" + next_curs.urlsafe())