我正在基于Google的应用程序引擎编写一个非常简单的web应用程序。这是我第一次使用Python和Google的数据存储。
应用程序应该在其主页上显示一些问题。这些问题存储在一个名为named的表中。
class Question(db.Model):
question_id = db.IntegerProperty()
question = db.StringProperty()下面的代码选择该表的所有条目,并将数据提交给模板。
questions = db.GqlQuery('SELECT * FROM Question ORDER BY question_id')
# debugging loop
for question in questions:
logging.info(questions.question_id)
template_values = {
'questions' : questions
}最后,模板在index.html上显示问题。
{% for question in questions %}
// HTML-CODE
{{ question.question }}
// HTML-CODE
{% endfor %}实际上,这些(非常基本的)操作运行良好,但程序会跳过两次或向列表中添加问题。这完全是随机发生的。我甚至认为它可能在几个小时没有出现的时候消失了。该错误必须紧跟在GqlQuery语句之后发生,因为调试循环已经指示了错误的ids。
哪个问题被跳过或添加也是随机的,我在这里看不到模式。唯一的问题是,它要么比预期多一个问题,要么比预期少一个问题。永远不会出现一个问题被跳过,而另一个问题被同时添加两次的情况。表格问题目前只包含五个条目,所以它非常容易管理。
我希望这不只是我缺乏经验的结果。我在这个问题上花了几天的时间。
提前谢谢你。
发布于 2013-07-14 10:43:28
如果在代码中的其他地方添加或删除问题,可能会导致这种看似错误的行为。默认情况下,App Engine查询是“最终一致的”,这意味着查询不会立即反映数据存储的真实状态。您可以在https://developers.google.com/appengine/docs/python/datastore/queries#Python_Data_consistency上阅读有关查询一致性的更多信息。
正如本文所述,祖先查询具有很强的一致性。要做到这一点,你必须把你所有的问题放在同一个“实体组”中。这很容易做到,但它必然会引入一个瓶颈,并且会限制您创建或修改问题的速度。只有当您知道问题很少更改时,即使您的站点上有大量用户,它也是合适的。
如果你不认为这就是你所看到的问题,你能发布更多关于如何在你的应用程序中创建/修改/删除问题的细节吗?
https://stackoverflow.com/questions/17628725
复制相似问题