我正在使用GAE Python。我有两个根实体:
class X(ndb.Model):
subject = ndb.StringProperty()
grade = ndb.StringProperty()
class Y(ndb.Model):
identifier = ndb.StringProperty()
name = ndb.StringProperty()
school = ndb.StringProperty()
year = ndb.StringProperty()
result = ndb.StructuredProperty(X, repeated=True)
由于谷歌将我们的数据存储在多个数据中心,因此当我们进行查询时,我们可能无法获得最新数据,如下所示(如果有些更改已经" put"):
def post(self):
identifier = self.request.get('identifier')
name = self.request.get('name')
school = self.request.get('school')
year = self.request.get('year')
qry = Y.query(ndb.AND(Y.name==name, Y.school==school, Y.year==year))
record_list = qry.fetch()
我的问题:如何修改上述提取操作以始终获取最新数据
我已浏览相关的google help doc,但无法理解如何应用此处
根据Isaac回答的提示,以下是解决方案(将" latest_record_data"包含实体的最新数据):
def post(self):
identifier = self.request.get('identifier')
name = self.request.get('name')
school = self.request.get('school')
year = self.request.get('year')
qry = Y.query(ndb.AND(Y.name==name, Y.school==school, Y.year==year))
record_list = qry.fetch()
record = record_list[0]
latest_record_data = record.key.get()
答案 0 :(得分:3)
应用引擎有几种方法可以获得强大的一致性,最常见的是使用获取而不是查询和使用祖先查询。
要在示例中使用get,您可以将名称编码为实体键:
class Y(ndb.Model):
result = ndb.StructuredProperty(X, repeated=True)
def put(name, result):
Y(key=ndb.Key(Y, name), result).put()
def get_records(name):
record_list = ndb.Key(Y, name).get()
return record_list
祖先查询使用类似的概念来做更强大的事情。例如,使用特定名称获取最新记录:
import time
class Y(ndb.Model):
result = ndb.StructuredProperty(X, repeated=True)
@classmethod
def put_result(cls, name, result):
# Don't use integers for last field in key. (one weird trick)
key = ndb.Key('name', name, cls, str(int(time.time())))
cls(key=key, result=result).put()
@classmethod
def get_latest_result(cls, name):
qry = cls.query(ancestor=ndb.Key('name', name)).order(-cls.key)
latest = qry.fetch(1)
if latest:
return latest[0]
“祖先”是实体的第一对密钥。只要您将至少第一对的密钥放入查询中,您就会获得强大的一致性。