gpt4 book ai didi

python - Google App Engine 数据存储区查询返回过时数据

转载 作者:太空宇宙 更新时间:2023-11-04 10:27:57 26 4
gpt4 key购买 nike

我有一个基于 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 没有命中数据存储区的是什么?我在这里缺少什么?

最佳答案

数据存储仅对查询具有最终一致性。在复制数据期间,确实有可能遇到“陈旧”数据。

要确保在查询中强制执行强一致性,您需要使用祖先查询或按键获取。

阅读更多相关信息 here

例如:祖先查询

( documentation ) 为此,您显然需要稍微更改一下结构。我不知道模型“Contest”的祖先可能是什么,但假设它们都属于“mainAncestor”实体。

当你创建你的实体时,你需要有类似于:

newContest = Contest(parent=mainAncestor)

然后当你检索时,你将它添加到你的代码中:

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

这将强制您的数据保持高度一致。你显然需要创建那个“mainAncestor”,然后它会导致你需要确保你解决的其他警告(你只能每秒写入一次实体组(实体分组在同一祖先下),例如).

关于python - Google App Engine 数据存储区查询返回过时数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28386249/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com