【问题标题】:google app engine datastore get fails if I create the key using ancestor relationship如果我使用祖先关系创建密钥,谷歌应用引擎数据存储将失败
【发布时间】:2016-02-04 14:03:41
【问题描述】:

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

代码方面

失败:

存储:

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= 标签的唯一区别是创建祖先关系,以便有效地回答诸如“给我用户 X 发送的所有消息”之类的查询。

【问题讨论】:

  • 不,您对祖先目的的评估是错误的。请参阅下面的答案。这实际上是关于实体组。如果您之后的所有内容都是父/子关系并且不需要或不想要实体组,则可以使用普通查询。实体组的祖先也不能更改。如果您希望更改实体组中的父级,则必须使用不同的键进行删除和创建

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


【解决方案1】:

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

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

注意:通过键的父子关系不会像普通 SQL 数据库那样创建关系关系。它只是将父母和孩子放在同一个“实体组”(将实体放在同一台服务器上的花哨词),这允许您在它们上进行交易。

【讨论】:

  • 感谢您的回答。所以,如果我使用序列号作为键,看起来我需要按属性过滤的类型查询以获得我想要的(获取用户 X 发送的所有消息)。
【解决方案2】:

如你所说:

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()

【讨论】:

    猜你喜欢
    • 2011-01-30
    • 2017-06-01
    • 2014-10-21
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多