'Exceeded maximum allocated IDs' 在生产 GAE 中

'Exceeded maximum allocated IDs' in production GAE

我正在尝试将模型从一个实体复制到另一个实体,同时保留它们自动生成的 ID。我正在使用以下代码:

key = db.Key.from_path('TargetEntity', source.key().id())
db.allocate_id_range(app, start = source.key().id(), end = source.key().id())
TargetEntity(key = key).put()

这在 dev_appserver 中工作正常,但是当 运行 这在生产中时,allocate_id_range 抛出 "Exceeded maximum allocated IDs"。它试图分配的 ID 是 5093058741796864L.

Whosebug 上提及此问题的其他问题要么开始使用他们自己的 ID 生成器(这不是解决方案),要么似乎是由于多年前使用新的 ID 生成器(这不是似乎不再适用了)。

所以回到 2013 年 6 月左右,数据存储中 ID 分配的默认值变为 "scattered ids"

https://cloudplatform.googleblog.com/2013/05/update-on-datastore-auto-ids.html

您尝试分配的 ID 是一个分散的 ID。 allocated_id_range 处理的 ID 是连续的。

你想要的是 _reserve_keys 函数,它与分散的 ID 一起工作并执行你想要的确切操作(给定一个密钥,告诉 ID 分配你有它并且它不应该重新分配它)。

不幸的是,它会很烦人。它位于:

https://cloud.google.com/appengine/docs/python/refdocs/modules/google/appengine/datastore/datastore_rpc

并致力于密钥的 protobuf 表示。

另一个同样有效的替代解决方案是:

使用具有足够位的随机数生成器生成随机的、非连续的 ID,从统计上讲不可能发生冲突。在您的模型键中使用它们。

如果您想要一个较小的 ID space,或者不信任随机数生成器,那么您可以使用交易来验证该 ID 是否未被使用。