通过put()保存实体后,是否会立即向数据存储区应用任何进一步的更改?

时间:2014-04-07 13:21:51

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

直到今天我还没注意到。

record3 = Record(record_date=today.date(), user=user.key)
record3.put()
record3.record_date=tomorrow.date()
record = Record.query().get()

我创建一个实体并将其存储在数据存储中。然后我改变它的日期,但不要通过Put()保存它。当我从数据存储区查询它时,我希望日期显示今天的日期,但它已经显示了明天的日期。

put()是否使用某种更新后挂钩,以便在put()发生后始终更新实体?它与使用SQL的传统ORM完全不同。

更新 证明我的观点或为了遗漏某些东西:

def test_get_or_insert_updates_after_get(self):
        user = self.signup()
        today = datetime.datetime.strptime('20140405', '%Y%m%d')
        tomorrow = datetime.datetime.strptime('20140406', '%Y%m%d')
        record3 = Record(record_date=today.date(), user=user.key)
        record3.put()
        record3.record_date=tomorrow.date()
        record = Record.query().get()
        self.assertEqual(today.date(), record.record_date)

此单元测试失败。但为什么呢?

  

AssertionError:datetime.date(2014,4,5)!= datetime.date(2014,4,6)

解决方案: 起初我理解丹尼尔的解决方案有点困难。这是代码示例:

ctx = ndb.get_context()
ctx.clear_cache()
record = Record.query().get()

1 个答案:

答案 0 :(得分:2)

你被ndb in-context cache误导了:

  

当NDB函数写入数据存储区时,它还会写入上下文缓存区。当NDB函数读取实体时,它首先检查上下文缓存。

由于您正在执行直接.get()而不是查询,因此ndb将使用上下文缓存并返回相同对象。它没有从数据存储区获取新实例,因此您将看到该对象的本地修改。您可以通过以下方式验证:

self.assertTrue(record is record3)

或者,使用查询,或专门设置上下文以禁用缓存,如上面的链接所述。