直到今天我还没注意到。
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()
答案 0 :(得分:2)
你被ndb in-context cache误导了:
当NDB函数写入数据存储区时,它还会写入上下文缓存区。当NDB函数读取实体时,它首先检查上下文缓存。
由于您正在执行直接.get()
而不是查询,因此ndb将使用上下文缓存并返回相同对象。它没有从数据存储区获取新实例,因此您将看到该对象的本地修改。您可以通过以下方式验证:
self.assertTrue(record is record3)
或者,使用查询,或专门设置上下文以禁用缓存,如上面的链接所述。