[英]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.