【发布时间】: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