簡體   English   中英

Google App Engine數據存儲區查詢返回陳舊數據

[英]Google App Engine Datastore query returning stale data

我有一個使用db Datastore基於GAE的項目。 在我的項目中,我每15分鍾運行一次作業,然后更新Datastore中的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不會影響數據存儲什么? 我在這里想念什么?

數據存儲僅最終對於查詢是一致的。 在復制數據的過程中,確實有可能擊中“陳舊”數據。

為了確保在查詢中強制強一致性,您需要使用祖先查詢或get by鍵。

在這里閱讀更多關於此的信息

例如:祖先查詢

文檔 )為此,您顯然需要對結構進行一些更改。 我不知道“競賽”模型的祖先是什么,但可以說它們都屬於“ mainAncestor”實體。

創建實體時,您需要具有類似於以下內容的內容:

newContest = Contest(parent=mainAncestor)

然后在檢索時,將其添加到代碼中:

query = Contests.all()
query.ancestor(mainAncestor) 
contests = query.fetch(1)

這將使您的數據具有很強的一致性。 顯然,您將需要創建該“ mainAncestor”,然后將引起其他警告,以確保您每秒要解決一次(例如,您只能寫一次實體組(在同一祖先下分組的實體)) )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM