sqlalchemy 内でオブジェクトの主キーのハッシュを取得しようとしています。
例class User
は次のようになります。
class User(base):
__tablename__ == 'users'
id = Column(Integer, primary_key=True)
hash = Column(String(38), unique=True)
ユーザーを追加するには:
user = User()
session.add(user)
session.commit()
print user.id
主キーは . の後に割り当てられるため、ハッシュプロセスを ORM イベントにフックしようとしましたsession.flush()
。ただし、フラッシュ中は、オブジェクトの状態への変更は永続化されません。
私にとって唯一の解決策はuser.id
、最初のフラッシュの後に遅延ロードし、ハッシュ、割り当て、再度フラッシュして、最後にコミットすることです。
class User(base):
...
@hybrid_property
def hash(self):
if not self.hash:
self.hash = hash_function(self.id)
return self.hash
これにより、次のことが可能になります。
user = User()
session.add(user)
hash = user.hash
session.commit()
sqlalchemy は、 and を開始し、UPDATE
anduser.hash
を永続化します。
しかし、これは悪いオプションのように思えます。たとえば、誰かがハッシュを割り当てるのを忘れた場合です (おそらく、オブジェクトの作成時にハッシュは必要ありません)。
別のオプションはありますか?自動的にハッシュされることを本当に望んでいますafter_insert
。多分私は ORM イベントのドキュメントで何か不足していますか?