如果我使用祖先关系

时间:2015-11-04 07:09:58

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

当我将消息插入数据存储区时,我使用消息的序列号创建密钥,并与发送消息的用户建立祖先关系。当我尝试使用仅从序列号创建的密钥检索消息时,它会失败。如果我更改插入以使用仅基于序列号的键,则后面的检索会成功。

代码逐

此操作失败:

存储

p_key = ndb.Key(StoredBcastMsg,sendingUser)
c_key = ndb.Key(StoredBcastMsg,prof['seqNum'],parent=p_key)
prof['key']=c_key
StoredBcastMsg(**prof).put()

检索失败

msgToRet=ndb.Key(StoredBcastMsg,seqNum).get() #Fails even though sequence number is there in the store

成功:

存储

prof['key']=c_key
StoredBcastMsg(**prof).put()
c_key = ndb.Key(StoredBcastMsg,prof['seqNum'])

检索成功:

msgToRet=ndb.Key(StoredBcastMsg,seqNum).get() #Succeeds

这是预期的行为吗?我认为在创建密钥时添加parent =标记的唯一区别是创建一个祖先关系,允许有效地回答诸如&#34之类的查询;给我用户X发送的所有消息。"

2 个答案:

答案 0 :(得分:2)

父键是子键的一部分,您需要完整的键来检索实体。

因此,要检索子实体,您需要知道完整的密钥,这意味着您需要知道父密钥。

注意:通过键的父子关系不会在普通SQL数据库拥有它的情况下创建关系关系。它只是将父级和子级放在同一个“实体组”中(用于将实体放在同一服务器上的奇特的词),这允许您对它们进行交易。

答案 1 :(得分:0)

如上所述:

p_key = ndb.Key(StoredBcastMsg,sendingUser)
c_key = ndb.Key(StoredBcastMsg,prof['seqNum'],parent=p_key)
prof['key']=c_key
StoredBcastMsg(**prof).put()
这成功了。要检索此实体,您必须使用完全相同的密钥:

msgToRet=c_key.get()

或者,格式更长:

p_key = ndb.Key(StoredBcastMsg,sendingUser)
msgToRet=ndb.Key(StoredBcastMsg,seqNum,parent=p_key).get()