連番整数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するしかないのかなー。ださいなー。