Получение идентификатора объекта внутри транзакции

У меня есть транзакция хранилища данных, в которой я создаю сущность (пользователя), позволяющую хранилищу данных генерировать для меня идентификатор.

Затем я хотел бы использовать этот идентификатор, чтобы я мог создать другую сущность (другого типа).

Хотя это возможно с обычным хранилищем данных 'save' api:

datastore.save(user).then(() => {
  userId = user.key.id // returns entity's ID created by datastore
})

Тем не менее, это не представляется возможным при использовании транзакции:

transaction.save(user).then(() => {
  console.log( user.key.id )
})

Приведенные выше результаты "не могут прочитать" тогда "неопределенного", даже если в документах нет обратного вызова, я все равно попробовал.

Как создать / сохранить объект с транзакцией, как я могу получить автоматически сгенерированный идентификатор этого объекта?

1 ответ

Решение

Выделить идентификаторы

Вы можете использовать Method: projects.allocateIds перед вводом транзакции:

Выделяет идентификаторы для заданных ключей, что полезно для ссылки на объект до его вставки.

Использование клиентской библиотеки Python.

Это создаст в Datastore "резервные" идентификаторы (даже при том, что с этими идентификаторами все еще не будет никаких объектов), и перед вставкой будет предотвращено столкновение идентификаторов.

Внутри вашей транзакции вы получаете один идентификатор из выделенных и присваиваете первому объекту. Затем вы можете ссылаться на тот же идентификатор во второй сущности, даже до того, как транзакция зафиксировала вставку первой сущности.

Лучшая практика для транзакций

Транзакции имеют максимальную продолжительность 60 секунд с 10-секундным временем простоя после 30 секунд.

Из-за этого перед выполнением транзакции рекомендуется выполнить все возможное. Разумеется, присвоение идентификаторов - это одна из вещей, которую вы можете запустить перед транзакцией.

Другие вопросы по тегам