在sqlachemy中触发

在sqlachemy中触发,第1张

在sqlachemy中触发

您可以使用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。您必须再添加一个触发器或事件处理程序,以支持双向更改传播。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存