gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 17:42:01 29 4
gpt4 key购买 nike

直到今天我才注意到一些事情。

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

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

put() 是否使用某种更新后 Hook ,以便在 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()

最佳答案

你被 ndb 误导了 in-context cache :

When an NDB function writes to the Datastore, it also writes to the in-context cache. When an NDB function reads an entity, it checks the in-context cache first.

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

self.assertTrue(record is record3)

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

关于python - 通过 put() 保存实体后,是否会立即将任何进一步的更改应用于数据存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22913756/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com