簡體   English   中英

為什么google datastore第二個查詢返回修改后的實例(第一次查詢后沒有調用put)?

[英]why does google datastore second query returns modified instance (without calling put after first query)?

我在查詢數據存儲時遇到了非常反直覺的情況。

這是步驟:

  1. 使用第一個查詢檢索對象: list_objects = MyModel.query(cls.name == name).fetch()

  2. 修改list_objects: for o in list_objects: o.value = new_value 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_objects_2 for o in list_objects_2: o.value = new_new_value ,現在list_objects1都有new_new_value

我也試過fetch(keys_only = True)k.get() ,但同樣的問題。

我的印象是查詢是針對實際的數據存儲區,為什么它不斷返回相同的實例而不是構造新的實例? 是因為某種緩存?

查看此文章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()不發生數據存儲交互

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM