在事务中获取实体的 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 是您可以在交易前 运行 做的事情之一。
我有一个数据存储事务,我在其中创建了一个实体(用户),让数据存储为我生成 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 是您可以在交易前 运行 做的事情之一。