如何在GAE Python NDB中获取最新数据

时间:2014-02-01 06:01:11

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我正在使用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()  

1 个答案:

答案 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]

“祖先”是实体的第一对密钥。只要您将至少第一对的密钥放入查询中,您就会获得强大的一致性。