【问题标题】:How to use High Replication Datastore如何使用高复制数据存储
【发布时间】:2012-01-23 00:13:13
【问题描述】:

好的,我已经看过video 并阅读了App Engine 文档中的文章(包括Using the High Replication Datastore)。但是,我仍然对它的实际用法完全感到困惑。我了解(从视频中)的好处,它们听起来很棒。但我缺乏的是一些实际的例子。网络上有很多主/从示例,但很少说明(使用适当的文档)高复制数据存储。 Using the High Replication Datastore 文章中使用的留言簿代码示例通过添加以前的留言簿代码示例没有的新功能来说明祖先键(似乎您可以更改留言簿)。这只会增加混乱。

我经常在 GAE 上使用djangoforms,我想知道是否有人可以帮助我将所有这些查询转换为与高复制数据存储兼容的查询(让我们暂时忘记并非所有查询都必须与高复制数据存储兼容的讨论查询并专注于示例本身)。

更新:对于高复制数据存储兼容查询,我指的是始终返回最新数据而不是潜在陈旧数据的查询。使用实体组似乎是这里的方法,但如前所述,我没有很多实用的代码示例来说明如何做到这一点,所以这就是我要找的!

所以the queries in this article 是:

本文中主要的重复查询是:

query = db.GqlQuery("SELECT * FROM Item ORDER BY name")

我们将翻译成:

query = Item.all().order('name')  // datastore request

验证表单的过程如下:

data = ItemForm(data=self.request.POST)
if data.is_valid():
    # Save the data, and redirect to the view page
    entity = data.save(commit=False)
    entity.added_by = users.get_current_user()
    entity.put()  // datastore request

从数据存储中获取最新条目以填充表单的情况如下:

id = int(self.request.get('id'))
item = Item.get(db.Key.from_path('Item', id))  // datastore request
data = ItemForm(data=self.request.POST, instance=item)

那么我/我们需要做些什么来使所有这些数据存储请求与高复制数据存储兼容?

最后一件事我也不清楚。使用祖先键,这对数据存储中的模型是否有任何影响。例如,在他们使用的留言簿代码示例中:

def guestbook_key(guestbook_name=None):
  return db.Key.from_path('Guestbook', guestbook_name or 'default_guestbook')

但是,'Guestbook' 不存在 in the model,那么您如何在此使用 'db.Key.from_path' 以及为什么会这样呢?这是否会改变数据在数据存储中的存储方式,我在检索数据时需要考虑这一点(例如,它是否添加了另一个我应该在使用 djangoforms 时不显示的字段)?

就像我之前说的,这让我很困惑,非常感谢您的帮助!

【问题讨论】:

  • 听起来您正在寻找一种神奇的方法来使 HR 数据存储像 M/S 一样。没有一个 - 您只需要考虑过时数据对您的每个查询的影响,如果这是一个问题,请重新构建。
  • 嗨,尼克,感谢您抽出宝贵时间回答我的问题。我并不是想为 HR 找到一个像 M/S 一样行事的神奇秘诀,尽管我想我理解你为什么会这样想。我想要得到的是代码 sn-ps,使用这些示例,实际上能够对 HR 兼容请求进行编码(注意:没有过时的数据)。在过去的几年里,我和 M/S 一起工作,现在我想和 HR 一起工作,但我不知道怎么做。 GAE 网站上的文档非常少,只有实际的代码示例。我选择 djangoforms 示例是因为我经常使用它并且可以专注于新代码。
  • “注意:没有陈旧的数据” - 几乎是在寻求一种将 HR 转变为 MS 的方法。您无需更改您的查询以与 HR 合作 - 您只需接受它最终是一致的,并在必要时重新做一些事情以考虑到这一点。
  • 就像我说的,我知道你会怎么想。但是,我试图在这里获取使用实体组和祖先键的示例,因为这太令人困惑了。你提到我不需要重写我的查询并且没有任何过时的数据是不可能的?请记住,我了解并非每个查询都需要是最新数据(事实上,我明确提到暂时不讨论该讨论)并且您希望使用大部分过时的数据。不幸的是,您的回答没有给我关于如何重写我的查询以使用实体组和祖先键的代码示例。
  • 只是添加到示例中:想象一下,我使用 djangoforms 更新一行或使用普通查询在 HR 数据存储中输入一个新行(如上面我的问题中所述)。在此事务之后,我将用户重定向到一个处理程序,在该处理程序中查询此数据并将其显示给用户。根据你的说法,我不能这样做,我不需要重写我的代码?我认为实体组和祖先键的整个想法是弥合这一差距,并允许您获取最新数据。请详细说明为什么您说我不能通过更改查询来做到这一点?我真的很感激,因为我正在努力理解这一点。

标签: python google-app-engine google-cloud-datastore


【解决方案1】:

我不确定您为什么认为需要更改查询。您链接到的文档明确指出:

后端发生变化,但数据存储区 API 完全没有变化。无论您使用哪个数据存储,您都将使用相同的编程接口。

该页面的意思是说,如果您不使用实体组,查询可能会不同步。您的最终代码 sn-p 只是其中的一个示例 - 字符串 'Guestbook' 正是一个祖先键。我不明白你为什么认为它需要存在于模型中。再一次,这与非 HR 数据存储区没有什么不同 - 一直以来,密钥都是从路径构建的,路径可以由任意字符串组成。您可能需要重新阅读entity groups and keys 上的文档。

【讨论】:

  • 你刚刚打败了我。虽然,“留言簿”不是祖先键。这是kind of the key
  • 您好,感谢您花时间尝试回答我的问题。对此,我真的非常感激。唯一的事情是,我想知道如何重写我上面提到的这些查询,以便与高复制数据存储很好地工作(抱歉不够清楚,但这意味着我可以访问最新数据而不是陈旧数据) .我实际上已经重读了您链接的文档超过 5 次,但仍然不知道如何重写我的代码。我想我理解(部分)为什么要使用它以及陈旧数据与最新数据背后的理论,但不知道如何使用实际代码来实现这一点。
  • 嗨,彼得,感谢您抽出宝贵时间回答我的问题。不幸的是,如果您想要最新数据,这似乎不是真的。有时您需要最新数据(尤其是在更新某些内容之后),然后您想要使用/向用户展示它。在这些情况下,正常的查询(目前在我的问题中记录并在上面列出)对于 HR 数据存储来说是不够的。
【解决方案2】:

使用 HRD 的变化不在于如何进行查询,而在于对您返回的数据做出何种保证。你举的例子:

query = db.GqlQuery("SELECT * FROM Item ORDER BY name")

也将在 HRD 工作。问题(基本上)是这种查询(使用这种语法或 Item.all() 形式)可能会返回稍微过时的对象。这对留言簿来说可能没什么大不了的。

请注意,如果您直接通过键获取对象,则它永远不会过时。只有查询才能看到此问题。您可以通过将所有需要保持一致的实体放在single entity group 中来避免查询出现此问题。请注意,这限制了您可以写入实体组的速率。

在回答您的后续问题时,“留言簿”是实体的名称。

【讨论】:

  • 也感谢您尝试回答我的问题!我非常感谢。我刚刚对丹尼尔的回答发表的大部分评论也适用于你的回答。我仍然想将我的问题中提到的查询转换为可以获取最新数据的数据存储请求(让我们忘记在留言簿的情况下是否有必要)。 ---您还提到:“直接通过键获取对象”和“您可以通过将所有需要保持一致的实体放在单个实体组中来避免查询的这个问题。” -> 你是怎么做到的,请提供代码示例?
猜你喜欢
  • 1970-01-01
  • 2011-09-04
  • 2012-09-04
  • 2013-04-09
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 2019-01-23
  • 2021-07-31
相关资源
最近更新 更多