0

我試圖將模型從一個實體複製到另一個實體,保留其自動生成的ID。我使用下面的代碼:'生產中超出最大分配ID'GAE

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拋出「超出最大分配的ID」。它試圖分配的ID是5093058741796864L

有關StackOverflow的其他問題提到了這一點,它們要麼開始使用它們自己的ID生成器(這不是解決方案),要麼是由於多年前使用新的ID生成器時出現異常高ID的問題似乎適用了)。

+0

當我使用'db'時,手動生成的ID有一些問題,但當我切換到'ndb'時,它們消失了。無論如何,切換到'ndb'是一個好主意。 –

回答

1

所以圍繞2013年6月回在數據存儲ID分配默認成了「散IDS」

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

您要分配的ID是一種稀散ID。 ID是那個allocated_id_range句柄是連續的。

你想要的是_reserve_keys函數,它與ScatterED ID一起工作,並執行你想要的確切操作(給定一個鍵,告訴ID分配你有它並且它不應該重新分配它)。

不幸的是,這將是惱人的。它位於:

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

和工程上的鍵protobuf的表示。

該作品一樣好是另一種解決方案:

使用具有足夠比特碰撞是統計上不可能的隨機數發生器生成隨機的,非連續的ID。在模型鍵中使用它們。

如果您想要更小的ID空間,或者不信任隨機數生成器,那麼您可以使用事務來驗證ID尚未使用。