在事务中获取实体的 ID

Getting entity's id inside a transaction

我有一个数据存储事务,我在其中创建了一个实体(用户),让数据存储为我生成 ID。

然后我想使用该 ID 来创建另一个实体(另一种)。

虽然这对于常规数据存储是可行的 '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 )
})

以上输出"cannot read 'then' of undefined'", 尽管 docs 中没有列出回调,但我还是尝试了。

当 creating/saving 实体进行交易时,如何检索该实体的自动生成 ID?

分配 ID

您可以在进入交易前使用Method: projects.allocateIds

Allocates IDs for the given keys, which is useful for referencing an entity before it is inserted.

Using the Python client library.

这将生成数据存储 'reserve' 个 ID(即使仍然不会使用这些 ID 创建任何实体)并在插入之前避免 ID 冲突。

在您的交易中,您从分配给第一个实体的 ID 中获得一个 ID。然后您可以在第二个实体中引用相同的 ID,甚至在事务提交第一个实体插入之前。

交易最佳实践

Transactions have a maximum duration of 60 seconds with a 10 second idle expiration time after 30 seconds.

因此,最佳做法是在进入交易之前执行所有可能的操作。当然,分配 ID 是您可以在交易前 运行 做的事情之一。