我已经知道对于一般情况:这个问题就足够了:SQLAlchemy set default value of one column to that of another column
但是当我的列依赖于Id列时,它就不起作用了,因为id是自动生成的。
例如:使用与另一个问题相同的示例
class Substance(Base):
__tablename__ = "substances"
id = Column(Integer, primary_key=True)
code = Column(String, unique=True)
name = Column(String, unique=True)
subtance_hash = Column(String, unique=True, default=hashgen)
def hashgen(context):
uid = context.get_current_parameters()['id'] + 100
name = context.get_current_parameters()['name']
code = context.get_current_parameters()['code']
return some_hash_function(uid, name, code)
def some_hash_function(uid, name, code):
# this is a stupid example for completeness
return str(uid) + str(name) + str(code) 这里的问题是uid是None,因为我认为它会在提交查询时自动生成?
所以它会抛出一个错误:
sqlalchemy.exc.StatementError: (builtins.KeyError) 'id'有可能做到这一点吗?如果是这样的话,是怎么做的?
发布于 2020-01-02 19:34:01
您可以刷新会话以在提交之前设置id。然后你可以计算你的哈希值。您还可以使用event system is SQLAlchemy来侦听after_flush事件并计算那里的散列。例如:
class Substance(Base):
__tablename__ = "substances"
id = Column(Integer, primary_key=True)
code = Column(String, unique=True)
name = Column(String, unique=True)
subtance_hash = Column(String, unique=True)
@event.listens_for(sessionOrSessionFactory, 'after_flush')
def hashgen(session, flush_context):
for obj in session:
if isinstance(obj, Substance):
obj.substance_hash = some_hash_function(obj)
def some_hash_function(obj):
# this is a stupid example for completeness
return str(obj.id + 100) + str(obj.name) + str(obj.code)另一种方法是使散列成为hybrid_property https://docs.sqlalchemy.org/en/13/orm/extensions/hybrid.html
我并没有太多地使用混合属性,所以我将把它留给其他人来贡献一个答案。
https://stackoverflow.com/questions/59474582
复制相似问题