使用后端NDB的GAE put_multi()实体

时间:2013-01-07 23:14:18

标签: python google-app-engine app-engine-ndb

我使用后端用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调用。

阅读NDB Caching

  

上下文缓存

     

上下文缓存仅在单个持续时间内持续存在   传入的HTTP请求,仅对处理的代码“可见”   那个要求。它很快;这个缓存存在于内存中。当一个NDB   函数写入数据存储区,它也写入上下文   缓存。当NDB函数读取实体时,它会检查上下文   先缓存。如果在那里找到实体,则没有数据存储区交互   发生了。

     

查询不会在任何缓存中查找值。但是,查询结果是   如果缓存策略这样说,则写回到上下文缓存中(但是   永远不要Memcache)。

是的,我迷失在这里。一切似乎都没问题。即使从控制台查询我得到了正确的总和,但从不在同一个处理程序上,无论什么功能等等。

我唯一注意到的是,当等待time.sleep(1)时,我得到了正确的结果。这与ndb.put_multi可能无法同步完成的事实有关。太困惑了......

1 个答案:

答案 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帮助我理解。

相关问题