連番整数IDを振るのに挫折した

まずこんなデコレータを作って

def synchronized(func):
    def synchronized_func(*args, **kw):
        return db.run_in_transaction(func, *args, **kw)
    return synchronized_func

つぎにこんなファクトリーを作った。

@synchronized
def make_instance(cls, *args, **kw):
    instance = cls(*args, **kw)
    last_one = cls.all().order("-added_on").get()
    if last_one:
        instance.unique_id = last_one.unique_id + 1
    else:
        instance.unique_id = 0
    instance.put()
    return instance

モデルの設計はもれなくadded_onとunique_idを持つ感じ。

class Game(db.Model):
    added_on = db.DateTimeProperty(auto_now_add=True)
    unique_id = db.IntegerProperty()
...

でこういう使い方をすると連番IDが振られる

    program, rest = logic.deal_cards()
    p = make_instance(Program, program=program, rest=rest)

と思ったら

Exception Type: BadRequestError
Exception Value: Can't query inside a transaction.

がーんorz



get_or_insertでwhileするしかないのかなー。ださいなー。