【问题标题】:Is it possible to modify only one property of a ndb datastore entity?是否可以只修改 ndb 数据存储实体的一个属性?
【发布时间】:2014-01-08 19:28:20
【问题描述】:

我有一个具有多个属性的数据存储实体。每个属性都使用单独的方法进行更新。但是,我经常发现任何一种方法都会用旧值(Null)覆盖它没有修改的属性。

例如。

class SomeModel(ndb.Model): 
  property1 = ndb.StringProperty()
  property2 = ndb.StringProperty()

def method1(self, entity_key_urlsafe):
  data1 = ndb.Key(urlsafe = entity_key_urlsafe).get()
  data1.property1 = "1"
  data1.put()

数据 1 实体现在具有值为“1”的 property1

def method2(self, entity_key_urlsafe):
  data1 = ndb.Key(urlsafe = entity_key_urlsafe).get()
  data1.property2 = "2"
  data1.put()

数据 1 实体现在具有值为“2”的 property2

但是,如果这些方法连续运行 - 方法 2 似乎会用其初始值 (Null) 覆盖 property1。

为了解决这个问题,我一直在使用延迟库,但它不够可靠(延迟实体似乎时不时地消失)或可预测(_countdown 时间似乎充其量只是为了指导) .

我的问题是:有没有办法在调用 data1.put() 时只检索和修改数据存储实体的一个属性而不覆盖其余属性? IE。在 method2 的情况下 - 我可以只写入 property2 而不覆盖 property1 吗?

【问题讨论】:

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


    【解决方案1】:

    防止此类覆盖的方法是确保您的更新在事务内部完成。使用 NDB,这真的很容易 - 只需将 @ndb.transactional 装饰器附加到您的方法:

    @ndb.transactional
    def method1(self, entity_key_urlsafe):
      data1 = ndb.Key(urlsafe = entity_key_urlsafe).get()
      data1.property1 = "1"
      data1.put()
    

    transactions 与 NDB 的文档提供的背景信息不如(旧的)DB version,因此要完全熟悉限制和选项,您应该阅读两者。

    【讨论】:

      【解决方案2】:

      我说

      我从来没有看到过关于这个的参考,或者一个技巧或一个黑客。 我也认为这样的操作很难存在。 当您在实体上执行.put() 时,实体会被序列化然后写入。

      实体是可以从数据存储中保存或检索的类的实例。 想象一下,如果您有一个包含auto_now 的日期属性?那时会发生什么? 2 个保存中的哪一个应该编辑该属性?

      虽然您的问题似乎有所不同。您的一个函数首先提交并取消其他方法的值,因为它检索的是过时的副本,而不是预期的副本。

      @Greg's 回答谈到交易。你可能想看看它们。

      事务用于并发请求,而不是用于继承。 想象一下,有 2 个用户同时按下保存按钮来增加一个计数器。那里的交易有效。

      @ndb.transactional
      def increase_counter(entity_key_urlsafe):
          entity = ndb.Key(urlsafe = entity_key_urlsafe).get()
          entity.counter += 1
          entity.put()
      

      事务将确保计数器正确。 尝试提交上述事务的第一个将成功,如果重试开启,则后者将不得不重试(默认为 3)。

      虽然继承是不同的东西。话虽如此,如果您要解决的问题类似于反例,我和@Greg 建议您更改使用事务的逻辑。

      【讨论】:

        猜你喜欢
        • 2013-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-28
        • 1970-01-01
        • 1970-01-01
        • 2021-07-29
        相关资源
        最近更新 更多