我正在使用后端编写多个实体ndb.put_multi(list_of_entities)
。
我遇到的问题是,在那之后,如果我进行查询,那么我没有得到任何结果。如果我设置一个睡眠定时器,例如 1 秒,我可以读取我刚刚编写的实体。
所以例如:
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 函数读取实体时,它首先检查上下文缓存。如果在此处找到实体,则不会发生 Datastore 交互。
查询不会在任何缓存中查找值。但是,如果缓存策略如此,查询结果将被写回上下文缓存(但永远不会写回 Memcache)。
嗯,我在这里迷路了。一切似乎都很好。即使从控制台查询我得到正确的总和,但永远不会在同一个处理程序上,无论什么功能等。
我唯一注意到的是,当等待时time.sleep(1)
,我得到了正确的结果。ndb.put_multi
所以这与可能不会同步完成的事实有关。如此迷茫....