Я использую бэкэнд для записи нескольких сущностей с помощью ndb.put_multi(list_of_entities)
.
Проблема, с которой я столкнулся, заключается в том, что сразу после этого, если я сделаю запрос, я не получу никаких результатов. Если я поставлю таймер сна, например, на 1 секунду, я смогу прочитать объекты, которые я только что написал.
So eg:
class Picture(ndb.Expando):
pass
class Favourite(ndb.Expando):
user_id = ndb.StringProperty(required=True)
pass
#...make lists with Picture and Favourite kinds
entities = favourites
entities[1:1] = pictures
ndb.put_multi(entities)
favourites = Favourite.query().filter(Favourite.user_id == user_id).fetch(99999, keys_only=True)
logging.info(len(favourites)) #returns 0 in dev_appserver why?
Сначала предположил, что проблема связана с кэшированием. Но:
Чтение Операции сущностей NDB с несколькими ключами или сущностями:
Дополнительное примечание: эти методы корректно взаимодействуют с контекстом и кэшированием; они не соответствуют напрямую конкретным вызовам RPC.
Чтение кэширования NDB
Контекстный кэш
Контекстный кеш сохраняется только на время одного входящего HTTP-запроса и «видим» только для кода, обрабатывающего этот запрос. Это быстро; этот кеш живет в памяти. Когда функция NDB записывает в хранилище данных, она также записывает в контекстный кэш. Когда функция NDB считывает сущность, она сначала проверяет контекстный кеш. Если сущность найдена там, взаимодействия с хранилищем данных не происходит.
Запросы не ищут значения в каком-либо кеше. Однако результаты запроса записываются обратно в контекстный кэш, если так указано в политике кэширования (но не в Memcache).
Хм, я тут потерялся. Кажется, все в порядке. Даже при запросе из консоли я получаю правильную сумму, но никогда в том же обработчике, независимо от того, какая функция и т. д.
Единственное, что я заметил, это то, что когда я ставлю ожидание time.sleep(1)
, я получаю правильные результаты. Так что это связано с тем фактом, что ndb.put_multi
может выполняться не синхронно или нет. Так запутался....
put_multi()
возвращается, не означает ли это, что объекты были помещены, а индексы и фиксация были успешными? Я не использую асинхронные методы. - person Jimmy Kane   schedule 08.01.2013