4

IDを999999999未満にしたいのですが、逆の効果があるようにプログラムしようとすると、IDが大きくなるだけで、IDを割り当てようとするとstart> end?

start, end = User.allocate_ids(max=999999999)
logging.info('start %d' % start)
logging.info('end %d' % end)
lower = start if start < end else end
key = User(id=lower).put()
logging.info('key: '+str(key))
user = key.get()
user.add_auth_id(email)

私のログ出力は、割り当てられるIDが間違っていることを示しています:

2012-02-13 03:19:07.396 start 98765439124
I 2012-02-13 03:19:07.396 end 98765439123

どうすればこれを修正できますか?

アップデート

私が使用する汚い回避策は、私がすべきではない独自のIDシステムを作成することですが、この場合の唯一の解決策であり、これによって競合や重複が発生することはないと思います。エンティティがいっぱいになり始めると遅くなる可能性がありますしかし、今のところ、これはユーザーに対して許容できる解決策のように見えますが、コードを見るとそれほど見栄えがよくないかもしれません。

    new_id = random.randint(1,999999999)
    logging.info('testing new id: %d' % new_id)
    while User.get_by_id(new_id) != None:
        new_id = random.randint(1,999999999)
    logging.info('creating new id: %d' % new_id)
    key = User(id=new_id).put()
4

1 に答える 1

5

NDB のドキュメントで説明されているように:allocateIds(max=)は、既に割り当てられている ID を予約しようとした場合に、利用可能な最初の ID を返します。

あなたの場合、 までのすべての ID999999999は以前に割り当てられています (おそらく への他の呼び出しによってallocate_ids)。

次の例を参照してください。

>>> Foo.allocate_ids(max=26740080011040)
(26740080011031L, 26740080011040L)

26740080011040 までのすべての ID を割り当てます

>>> Foo.allocate_ids(max=26740080011040)
(26740080011041L, 26740080011040L)

26740080011040 までのすべての ID は既に割り当てられています。最初に使用可能な ID は 26740080011041 で、最後に割り当てられたのは 26740080011040 です。

>>> Foo.allocate_ids(max=26740080011050)
(26740080011041L, 26740080011050L)

26740080011050 までのすべての ID を割り当てます

于 2012-02-13T11:51:41.730 に答える