我使用后端用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 Entities Operations on Multiple Keys or Entities:
高级注释:这些方法与上下文正确交互 高速缓存;它们不直接对应于特定的RPC调用。
是的,我迷失在这里。一切似乎都没问题。即使从控制台查询我得到了正确的总和,但从不在同一个处理程序上,无论什么功能等等。上下文缓存
上下文缓存仅在单个持续时间内持续存在 传入的HTTP请求,仅对处理的代码“可见” 那个要求。它很快;这个缓存存在于内存中。当一个NDB 函数写入数据存储区,它也写入上下文 缓存。当NDB函数读取实体时,它会检查上下文 先缓存。如果在那里找到实体,则没有数据存储区交互 发生了。
查询不会在任何缓存中查找值。但是,查询结果是 如果缓存策略这样说,则写回到上下文缓存中(但是 永远不要Memcache)。
我唯一注意到的是,当等待time.sleep(1)
时,我得到了正确的结果。这与ndb.put_multi
可能无法同步完成的事实有关。太困惑了......
答案 0 :(得分:5)
早上清醒的头脑总是比晚上头晕的头脑好。
谢谢大家的评论。问题解决了。你以正确的方式引导我,以回答我的问题:
我使用祖先查询来正确获取结果。值得一提的是
Understanding NDB Writes: Commit, Invalidate Cache, and Apply
写入数据的NDB函数(例如put())返回 缓存失效后; 应用阶段异步发生。
这意味着在每次投入后,申请阶段可能尚未完成。
并且:
此行为会影响您的数据的显示方式和时间 应用。这种变化可能不会完全适用于 基础数据存储在NDB之后几百毫秒左右 功能返回。更改时执行的非祖先查询 被应用可能会看到一个不一致的状态(即部分但不是全部 改变)。有关写入时间的更多信息 查询,请参阅App Engine中的事务隔离。
还有一些关于从Google Academy Retrieving data from the Datastore
获取的读写之间的一致性Google App Engine的高复制数据存储(HRD)提供了很高的优势 通过同步存储数据实现读写的可用性 在多个数据中心。但是,写入时的延迟 承诺,直到它在所有数据中心都可见,意味着 跨多个实体组(非祖先查询)的查询只能 保证最终的一致结果。结果,结果 此类查询有时可能无法反映最近的更改 基础数据。 但是,按键直接获取实体是 始终如一。
感谢@Paul C不断帮助,@ dragonx和@sologoub帮助我理解。