Запрос хранилища данных Google App Engine, возвращающий устаревшие данные
У меня есть проект на основе GAE с использованием db
Datastore
, В моем проекте я запускаю работу каждые 15 минут и обновляю данные в Datastore
, Тогда у меня есть конечная точка, которая запрашивает Datastore
и отображает результат. Но результат, который я получаю, устарел, а не тот, который был обновлен. Кажется, что GAE не бьет Datastore
и возвращает данные из кеша, но я не уверен. Вот мой код:
class MainHandler(webapp2.RequestHandler):
def get(self):
query = Contests.all()
contests_data = query.fetch(1) # fetch the data from datastore
self.response.write(contests_data[0].data)
class DataBaseHandler(webapp2.RequestHandler):
# the job that runs every 15 minutes
def get(self):
contests_data = get_all_contests() # get the new data
query = Contests.all()
contests = query.fetch(1)
contests[1].data = contests_data # update the data
db.put(contests[0])
self.response.write(json.dumps({"message":"updated"}))
Вот моя модель:
class Contests(db.Model):
"""Models Contests"""
data = db.TextProperty(default="{}")
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
Я попытался очистить кеш, используя memcache.flush_all()
но даже это не решает проблему. Почему GAE не возвращает обновленные данные? И как мне решить проблему?
РЕДАКТИРОВАТЬ: я изменил запрос на запрос предка, но данные все еще устарели (и это дней).
main.py
class MainHandler(webapp2.RequestHandler):
def get(self):
contest_list = ContestList.get_or_insert('contest_list', name='ContestList')
query = Contests.all()
query.ancestor(contest_list)
contests = query.fetch(1)
self.response.write(contests[0].data)
class DataBaseHandler(webapp2.RequestHandler):
def get(self):
contests_data = get_all_contests()
contest_list = ContestList.get_or_insert('contest_list', name='ContestList')
query = Contests.all()
query.ancestor(contest_list)
contests = query.fetch(1)
contests[0].data = contests_data
contests[0].put()
self.response.write(json.dumps({"message":"updated"}))
models.py
:
class ContestList(db.Model):
name = db.StringProperty()
class Contests(db.Model):
"""Models Contests"""
data = db.TextProperty(default="{}")
created = db.DateTimeProperty(auto_now_add=True)
modified = db.DateTimeProperty(auto_now=True)
Я даже пытался получить данные с помощьюkey
:
class MainHandler(webapp2.RequestHandler):
def get(self):
q = ndb.Key('Contests', 'contest_data').get()
if q:
self.response.write(q.data)
else:
self.response.write("error")
class DataBaseHandler(webapp2.RequestHandler):
def get(self):
Contests(key=ndb.Key('Contests', "contest_data"), data=get_all_contests()).put()
self.response.write(json.dumps({"message":"updated"}))
Что GAE не попадает в хранилище данных? Что мне здесь не хватает?
1 ответ
Хранилище данных в конечном итоге только для запросов. Во время репликации ваших данных есть вероятность, что вы действительно нажмете "устаревшие" данные.
Чтобы обеспечить строгую согласованность в запросе, необходимо использовать запрос предка или ключ "получить по".
Подробнее об этом здесь
Пример: запрос предка
( документация) Для этого вам, очевидно, нужно немного изменить свою структуру. Я не знаю, кто мог быть предком модели "Конкурс", но допустим, что они все подпадают под сущность "mainAncestor".
Когда вы создаете свои сущности, вам нужно иметь что-то похожее на:
newContest = Contest(parent=mainAncestor)
Затем, когда вы получаете, вы добавляете это в свой код:
query = Contests.all()
query.ancestor(mainAncestor)
contests = query.fetch(1)
Это приведет к строгой согласованности ваших данных. Очевидно, вам нужно будет создать этот "mainAncestor", и тогда он вызовет другие предостережения, которые вам понадобятся, чтобы убедиться, что вы обращаетесь (например, вы можете записывать в группу сущностей (сущности, сгруппированные под одним и тем же предком) раз в секунду, например,).