【问题标题】:GqlQuery returns random resultsGqlQuery 返回随机结果
【发布时间】:2013-07-13 09:14:12
【问题描述】:

我正在编写一个基于 Google 应用程序引擎的非常简单的网络应用程序。这是我第一次使用 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 目前仅包含五个条目,因此非常易于管理。

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

提前谢谢你。

【问题讨论】:

    标签: google-app-engine gql gqlquery


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 2015-01-14
      • 2017-12-27
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2011-01-18
      相关资源
      最近更新 更多