我在查询数据存储时遇到了非常反直觉的情况。
以下是步骤:
使用第一个查询检索对象:list_objects = MyModel.query(cls.name == name).fetch()
修改list_objects:for o in list_objects: o.value = new_value
第二次检索对象:list_objects_2 = MyModel.query(cls.name == name).fetch()
现在list_objects_2中的所有对象都有new_value,尽管在第2步中,从未调用过put来实际修改数据存储区,我在中间检查了数据存储区,并且值是原始值
修改list_objects_2:for o in list_objects_2: o.value = new_new_value
,现在list_objects1都有new_new_value
我也尝试了fetch(keys_only = True)
和k.get()
,但同样的问题。
我的印象是查询是针对实际的数据存储区的,为什么它不断返回相同的实例而不是构造新的实例?它是由于某种缓存?
答案 0 :(得分:0)
查看此文章https://cloud.google.com/appengine/docs/python/ndb/cache
上下文缓存很快;这个缓存存在于内存中。当一个NDB 函数写入数据存储区,它也写入上下文 缓存。当NDB函数读取实体时,它会检查上下文 先缓存。如果在那里找到实体,则没有数据存储区交互 发生了。
当NDB函数查询数据存储区时,结果列表为 从数据存储区检索。但是,如果有任何个人结果 在上下文缓存中,它用于代替从中检索的值 数据存储区查询。查询结果将写回到上下文中 缓存,如果缓存策略这样说(但永远不会发送到Memcache)。
1)list_objects = MyModel.query(cls.name == name).fetch()
预热上下文缓存
2)for o in list_objects: o.value = new_value
仅修改内存中的对象
3)list_objects_2 = MyModel.query(cls.name == name).fetch()
实际上没有发生数据存储交互,你从缓存中获取相同的对象
4)for o in list_objects_2: o.value = new_new_value
仅修改内存中的对象
5)fetch(keys_only = True)
和k.get()
没有发生数据存储互动