2014-07-17 50 views
0

我有一个表单提交POST数据处理程序,创建并放置一个名为项目的数据存储条目。然后,它重定向页面,并且其中数据存储条目被查询作为这样被发送GET请求:第一次尝试GAE查询空,而不是第二

query = Item.query() 
    userLessons = query.filter(Item.author == thisUser) 
    itemQuery = userLessons.filter(Item.name == itemName).fetch(1) 
    desiredItem = itemQuery[0] 

呈现的页面导致错误UnboundLocalError: local variable 'desiredItem' referenced before assignment。如果我简单地刷新页面并发送另一个GET请求,数据存储区条目就会奇迹般地出现。这怎么可能?我试着在放置Item之后的重定向之前将相同的查询添加到POST的底部,并且我得到相同的错误。有没有更好的方法来查询?

回答

1

数据存储操作是异步的。在插入数据存储后,实体在查询中变得可用需要几秒钟的时间。您有两种可能的解决方案:

  1. 将此实体添加到Memcache,然后将其保存到数据存储区。在随后的请求中,首先检查Memcache,并且仅在查询Datastore之后。在大多数情况下,您将不必查询数据存储。这种方法将为您节省一些阅读成本。

  2. 由于您需要一个实体,因此根本不要使用查询。用你的实体ID检索它:

Retrieving Entities from Keys

最好的解决办法是将这些方法结合起来。

+0

感谢您对异步操作的建议。考虑在查询的GET请求中尝试一个while循环,直到数据存储查询的长度大于0.只有一个实体被添加,​​并且这是一个很少会执行的操作。 – TomNash

+0

你不想为此做一个循环。特别是,您的数据存储查询最终一致:https://cloud.google.com/developers/articles/balancing-strong-and-eventual-consistency-with-google-cloud-datastore。这意味着它可能比查询请求返回最新信息花费的时间要长得多。如果您需要查询以返回最新结果,则需要在创建模型时通过使用祖先和指定父项来使其保持一致。 –

+0

@Patrick - get()操作始终强烈一致。当你需要一个实体并且你知道它的关键时,不需要祖先查询。 –

相关问题