0

我正在编写一个基于谷歌应用引擎的非常简单的网络应用程序。这是我第一次使用 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 %}

实际上,这些(非常基本的)操作运行良好,但程序两次跳过或添加问题到列表中。这完全随机发生。我什至认为它可能会在几个小时没有弹出时消失。错误必须在 GqlQuery 语句之后立即发生,因为调试循环已经指示错误的 id。

哪个问题被跳过或添加也是随机的,我在这里看不到模式。唯一的问题是,这不是比预期多或少的一个问题。似乎从来没有一个问题被跳过,另一个问题同时被添加两次。表 Question 目前仅包含五个条目,因此非常易于管理。

我希望这不仅仅是我缺乏经验的结果。我在这个问题上花了几天时间。

先感谢您。

4

1 回答 1

0

如果您在代码的其他地方添加或删除问题,则可能会导致这种看似错误的行为。默认情况下,App Engine 查询是“最终一致的”,这意味着查询不会立即反映数据存储区的真实状态。您可以在https://developers.google.com/appengine/docs/python/datastore/queries#Python_Data_consistency阅读有关查询一致性的更多信息。

正如文章所述,祖先查询是强一致的。为此,您必须将所有问题放在同一个“实体组”中。这很容易做到,但它必然会引入一个瓶颈,并且会限制您创建或修改问题的速度。仅当您知道问题很少更改时才合适,即使您的网站上有大量用户。

如果您认为这不是您所看到的问题,您能否发布更多关于如何在您的应用程序中创建/修改/删除问题的详细信息?

于 2013-07-14T02:43:28.227 回答