不同表上的after_insert事件

时间:2015-01-12 12:46:38

标签: python sqlalchemy flask-sqlalchemy

我有表A和表B,我想在表A事件中添加/更新/删除表B中的列。我尝试了以下内容:

  1. Mapper Events a.k.a @ event.listens_for(SomeClass,'before_insert')
  2. 文档说明

      

    映射器级刷新事件旨在对正在处理的直接对象的本地属性进行操作,并且仅通过给定连接的SQL操作进行操作...映射器事件中不支持的操作包括:Session.add()Session。 delete()...映射关系属性集/ del事件

    这限制了我可以对其他表做的任何事情。例如,

    def after_insert_listener(mapper, connection, target):
        target.value = "New Value"
    

    完美无缺

    def after_insert_listener(mapper, connection, target):
        target.child.count += 1
    

    没有做到这一点。放db.session.commit()会给我这个错误

      

    ResourceClosedError:此事务已关闭

    我尝试使用SessionEvents.before_flush(),但它既不能附加到特定模型也不能理解如何使用它。

    1. Flask-SQLAlchemy信号
    2. 我尝试使用models_committed信号:

      @models_committed.connect_via(app)
      def on_models_committed(sender, changes):
          for obj, change in changes:
              if change == 'delete' and hasattr(obj, '__after_delete__'):
                  obj.__after_delete__()
              elif change == 'update' and hasattr(obj, '__after_update__'):
                  obj.__after_update__()
              elif change == 'insert' and hasattr(obj, '__after_insert__'):
                  obj.__after_insert__()
      
      class TableA(db.Model):
          def __after_insert__(self):
              self.child.count += 1
              self.value = "New Value"
              db.session.commit()
      

      这给了我

        

      InvalidRequestError:此会话处于“已提交”状态;此事务中不能再发出SQL。

      如何在插入另一个模型后更新模型的实例?

1 个答案:

答案 0 :(得分:1)

你可以试试这个,

        @event.listens_for(B, "after_insert")
        def after_insert_listener(mapper, connection, target):
            A_table = A.__table__
            connection.execute(
                    A_table.update().
                     where(A_table.id==target.a_table.id). # Do Foreign key join porperly 
                     values(value='New Value')
            )