3

Я столкнулся с очень противоречивой ситуацией с запросом хранилища данных.Почему второй запрос google datastore возвращает измененный экземпляр (без вызова put после первого запроса)?

вот шаги:

  1. получить объект с первого запроса: list_objects = MyModel.query(cls.name == name).fetch()

  2. изменить list_objects: for o in list_objects: o.value = new_value

  3. получить объект 2-й раз: list_objects_2 = MyModel.query(cls.name == name).fetch()

  4. теперь все объекты в list_objects_2 имеют new_ значение, хотя на шаге 2, пут никогда не вызывалась на самом деле изменить хранилищу, и я проверил мой хранилищу между ними, а значение исходное значение

  5. изменить 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

Не звучит правильно, вы можете дать воспроизводимый пример? – marcadian

ответ

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()

фактически нет датастор взаимодействия имеет место, u получить sam е объекты из кэша

4) for o in list_objects_2: o.value = new_new_value

модифицирует объекты в памяти только

5) fetch(keys_only = True) и k.get() не хранилище взаимодействие происходит

+0

спасибо! В этом случае. Я понял это после проб и ошибок, это связано с кэшированием в процессе, если я добавлю fetch (use_cache = False), тогда запрос возвращает новые экземпляры, хотя я немного удивлен, почему включено кэширование в процессе по умолчанию. –

+0

u можете принять ответ сейчас;) – glmvrml

Смежные вопросы