Получить хранилище данных Google App Engine, если я создаю ключ, используя отношения предка
Когда я вставляю сообщение в хранилище данных, я создаю ключ, используя порядковый номер сообщения, и создаю отношения предка с пользователем, отправившим сообщение. Когда я пытаюсь получить сообщение, используя ключ, созданный только из порядкового номера, это не удается. Если я изменю вставку, чтобы использовать ключ, который основан только на порядковом номере, последующий поиск будет успешным.
Код-накрест
Это не удается:
Место хранения:
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".
2 ответа
Родительский ключ является частью дочернего ключа, и вам нужен полный ключ для извлечения сущности.
Итак, чтобы извлечь дочернюю сущность, вам нужно знать полный ключ, то есть вам нужно знать родительский ключ.
Примечание. Родительско-дочерние отношения через ключи не создают реляционные отношения в том смысле, в котором они существуют в обычных базах данных SQL. Он просто помещает родителя и ребенка в одну и ту же "группу сущностей" (причудливое слово для размещения сущностей на одном сервере), что позволяет вам выполнять транзакции с ними.
Как вы сказали выше:
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()