我正在编写一个基于Google的Application Engine的非常简单的Web应用程序。这是我第一次使用Python和Google的数据存储区。
应用程序应在其主页上显示一些问题。这些问题存储在名为Question的表中。
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 %}
实际上,那些(非常基本的)操作运行良好,但程序会跳过或向列表添加两次问题。这完全是随机发生的。我甚至认为它可能会消失,因为它没有弹出几个小时。由于调试循环已经指示错误的ID,因此必须在GqlQuery语句之后立即发生错误。
跳过或添加哪个问题也是随机的,我在这里看不到一个模式。唯一的问题是,它要么是一个问题,要么比预期的要多。似乎从未出现过一个问题被跳过而另一个问题同时被添加两次。表格问题目前仅包含五个条目,因此它非常易于管理。
我希望这不仅仅是因为我缺乏经验。我在这个问题上花了好几天。
提前谢谢。
答案 0 :(得分:0)
如果要在代码中的其他位置添加或删除问题,可能会导致这种看似错误的行为。默认情况下,App Engine查询“最终一致”,这意味着查询不会立即反映数据存储的真实状态。您可以在https://developers.google.com/appengine/docs/python/datastore/queries#Python_Data_consistency了解有关查询一致性的更多信息。
正如文章所述,祖先查询非常一致。要做到这一点,您必须将所有问题都放在同一个“实体组”中。这很容易做到,但它必然会引入一个阻塞点,它将限制您创建或修改问题的速度。只有当您知道问题很少会被更改时,即使您的网站上有大量用户,也是合适的。
如果您认为这不是您所看到的问题,您是否可以在应用程序中发布有关如何创建/修改/删除问题的更多详细信息?