您可以使用DDL类在数据库中创建触发器:
update_task_state = DDL('''CREATE TRIGGER update_task_state UPDATE OF state ON obs BEGIN UPDATE task SET state = 2 WHERe (obs_id = old.id) and (new.state = 2); END;''')event.listen(Obs.__table__, 'after_create', update_task_state)
这是最可靠的方法:当不使用ORM时,它适用于批量更新,甚至适用于应用程序之外的更新。但是也有缺点:
- 您必须注意触发器是否存在并且是最新的;
- 它不是可移植的,因此如果您更改数据库,则必须重写它。
- 除非您使它过期(例如,使用某些事件处理程序),否则SQLAlchemy不会更改已加载对象的新状态。
以下是不太可靠的解决方案(仅在ORM级别上进行更改时才起作用),但解决方案要简单得多:
from sqlalchemy.orm import validatesclass Obs(Declarativebase): __tablename__ = 'obs' id = Column(Integer, primary_key=True) state = Column(Integer, default=0) @validates('state') def update_state(self, key, value): self.task.state = value return value
我的两个示例都以一种方式工作,即它们在obs更改时更新任务,但在任务更新时不触摸obs。您必须再添加一个触发器或事件处理程序,以支持双向更改传播。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)