【问题标题】:How to fetch the latest data in GAE Python NDB如何在 GAE Python NDB 中获取最新数据
【发布时间】:2014-02-01 06:01:10
【问题描述】:

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

由于 google 将我们的数据存储在多个数据中心,当我们进行如下所示的查询时,我们可能无法获得最新的数据(以防某些更改已被“放置”):

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()  

我的问题:我应该如何修改上面的 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()  

【问题讨论】:

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


    【解决方案1】:

    应用引擎有几种方法可以获得强一致性,最常见的是使用获取而不是查询和使用祖先查询。

    要在您的示例中使用 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]
    

    “祖先”是实体密钥的第一对。只要您可以将至少具有第一对的键放入查询中,您将获得强一致性。

    【讨论】:

    • 感谢您的回复..我已经根据您的回答在我的上下文中更新了这个问题,并提供了一个可能的解决方案..您能否确认这是否可行..如果可行,是否有任何缺点..
    • 标准查询出现的“最终一致性”是最近添加或最近更改以匹配查询的实体可能缺失。在您列出的两个示例中,每个匹配实体内的数据都是最新的。不需要 get() 调用。
    • 由于“eventual_consistency”,无法保证在我的第一个基于“fetch”的解决方案中获取的数据是最新的。我不确定我的第二个(最后一个或最新的)“fetch”和基于“获取”的解决方案..
    • 如果 fetch 返回您要查找的实体,则该实体中的 data 将已经是最新的。就好像 ndb.Query 总是获取匹配实体的键,然后为您调用 get()。所以你绝对不需要调用 get()。
    • 好的..所以你的意思是说单个实体将始终保持高度一致..并且会反映最近对其所做的任何更改,因为它是单个实体(或实体组)..希望我理解正确.. db(developers.google.com/appengine/docs/python/datastore/…) 有一个文档,用于强一致性指南,但不适用于 ndb
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多