我正在尝试在 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 启动 anUPDATE
和 theuser.hash
并使其持久化。
但这似乎是一个糟糕的选择,例如,如果有人忘记分配散列(也许在创建对象时不需要散列)。
还有其他选择吗?我真的更喜欢它自动散列after_insert
。也许我在 ORM 事件文档中遗漏了一些东西?