Google App Engine数据存储区:创建和使用没有实体的密钥

时间:2017-03-14 12:19:05

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

对于Google Datastore专家,我有一个奇怪的问题。 我一直在研究正在运行的Google App Engine应用程序的代码。 我发现这些代码行让我感到困惑。

guestbook_key = ndb.Key(Greeting, DEFAULT_GUESTBOOK_NAME)
mykey = ndb.Key(   Greeting, # kind 
                str(i+1), # id
                parent=guestbook_key # parent
                )
g = Greeting(key=mykey)`

我的问题是:作为父母,是否可以使用不存在的实体的密钥? 我说是因为没有带键的实体" guestbook_key"已经创建(我在整个代码中搜索但我没有找到任何东西) 它是否仅为在不创建实体根的情况下为实体提供公共根而创建?

2 个答案:

答案 0 :(得分:0)

是。来自Using the ancestor path in the key(强调我的):

ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '1')
     

...

     

在示例中,('Account', 'sandy@foo.com')('Message', 123)和   ('Revision', '1')都是种类 - 标识符对的示例。

     

请注意Message不是模型类;它仅用作组合修订的方式,而不是用于存储数据。

     

...

     

您可以使用命名参数parent来指定中的任何实体   祖先的道路直接。以下所有符号均代表   相同的关键:

ndb.Key('Account', 'sandy@example.com', 'Message', 123, 'Revision', '1')

ndb.Key('Revision', '1', parent=ndb.Key(
    'Account', 'sandy@example.com', 'Message', 123))

ndb.Key('Revision', '1', parent=ndb.Key(
    'Message', 123, parent=ndb.Key('Account', 'sandy@example.com')))

在上面引用的示例中,Message实体密钥用作Revision实体的祖先/父密钥,而实际不存在Message个实体。

另一个这样的例子,这次显示了实际上并不存在的整个实体组的根(共同祖先):What would be the purpose of putting all datastore entities in a single group?

答案 1 :(得分:0)

即使在将任何内容写入数据存储区之前,密钥也只是程序内存中的一个对象。

当您将实体写入数据存储区时,您需要提供密钥(如果您需要自动ID,则完整或不完整)以及数据本身。