为什么google datastore第二个查询返回修改后的实例(在第一次查询后没有调用put)?

时间:2016-06-22 18:43:54

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

我在查询数据存储时遇到了非常反直觉的情况。

以下是步骤:

  1. 使用第一个查询检索对象:list_objects = MyModel.query(cls.name == name).fetch()

  2. 修改list_objects:for o in list_objects: o.value = new_value

  3. 第二次检索对象:list_objects_2 = MyModel.query(cls.name == name).fetch()

  4. 现在list_objects_2中的所有对象都有new_value,尽管在第2步中,从未调用过put来实际修改数据存储区,我在中间检查了数据存储区,并且值是原始值

  5. 修改list_objects_2:for o in list_objects_2: o.value = new_new_value,现在list_objects1都有new_new_value

  6. 我也尝试了fetch(keys_only = True)k.get(),但同样的问题。

    我的印象是查询是针对实际的数据存储区的,为什么它不断返回相同的实例而不是构造新的实例?它是由于某种缓存?

1 个答案:

答案 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()没有发生数据存储互动