Запрос хранилища данных Google App Engine, возвращающий устаревшие данные

У меня есть проект на основе GAE с использованием dbDatastore, В моем проекте я запускаю работу каждые 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", и тогда он вызовет другие предостережения, которые вам понадобятся, чтобы убедиться, что вы обращаетесь (например, вы можете записывать в группу сущностей (сущности, сгруппированные под одним и тем же предком) раз в секунду, например,).

Другие вопросы по тегам