0

자동 생성 된 ID를 유지하면서 하나의 엔티티에서 다른 엔티티로 모델을 복사하려고합니다. , allocate_id_range 던졌습니다 "초과 최대 할당 된 ID를"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에서 잘 작동하지만 생산이 실행시 : 나는 다음과 같은 코드를 사용하고 있습니다. 할당하려는 ID는 5093058741796864L입니다.

해결 방법이 아닌 자체 ID 생성기를 사용하여 시작한 StackOverflow의 다른 문제 또는 몇 년 전만해도 새로운 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 범위 핸들은 순차적입니다.

원하는 것은 SCATTERED ID와 함께 작동하고 원하는 정확한 조작을 수행하는 _reserve_keys 기능입니다 (키가 있으면 사용자가 가지고있는 ID 할당을 알려주고 다시 할당해서는 안됨).

불행히도 불편을 겪을 것입니다. 그것은에 있습니다

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

및 키의 protobuf 표현에서 작동합니다.

단지뿐만 아니라 작동하는 다른 솔루션 :

가 충돌이 통계적으로 불가능한만큼 비트 난수 생성기를 사용하여 임의의 비 순차적 ID를 생성합니다. 모델 키에있는 것을 사용하십시오.

ID 공간을 줄이거 나 임의의 숫자 생성기를 신뢰하지 않으려면 트랜잭션을 사용하여 ID가 ​​사용되지 않았는지 확인할 수 있습니다.

관련 문제