我正在尝试在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()
之后分配的。
但是,在flush期间,对象状态的更改不会持久化。
对我有效的唯一解决方案是在第一次flush后延迟加载user.id
,然后进行哈希、分配和再次flush,最后提交。
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启动了一个UPDATE
,并将user.hash
持久化。
但是,这似乎是一个糟糕的选择,例如,如果有人忘记分配哈希(也许在对象创建时不需要哈希)。
还有其他选项吗?
我真的很希望可以在after_insert
之后自动进行哈希。
也许我在ORM事件文档中错过了什么?