首页 > 解决方案 > 如何在 sqlalchemy 中触发级联删除的事件侦听器?

问题描述

我在 SQLAlchemy 中有一些模型,每当删除与该文件关联的记录时,我都需要执行一个操作(从磁盘中删除文件)。但是,将侦听器绑定到该对象的“删除”事件并不能解决问题。

例子 :

class ModelA(Base):
    __tablename__ = 'modela'
    id = Column(Integer, primary_key=True)

class ModelB(Base):
    __tablename__ = 'modelb'
    id = Column(Integer, primary_key=True)
    id_modela = Column(Key, ForeignKey('modela.id', ondelete="CASCADE"), index=True, nullable=True, default=None)
    modela = relationship('ModelA', backref=backref('modelbs', passive_deletes='all', lazy="dynamic"))

    id_foo = Column(Key, ForeignKey('modelc.id', ondelete="SET NULL"), index=True, nullable=True)
    foo = relationship('ModelC', foreign_keys='ModelB.id_foo', backref='modelbs')

class ModelC(Base):
    __tablename__ = 'modelc'
    id = Column(Integer, primary_key=True)
    path = Column(String(256), nullable=False)

@event.listens_for(ModelB.foo, 'remove', propagate=True)
def my_listener(modela, foo, initiator):
    os.remove(modela.foo.path)

modela每当在表上发送 DELETE 查询时,永远不会调用上述侦听器。我怎样才能使 sqlalchemy 处理这种级联删除并在父表上发送删除时调用我的事件侦听器?

标签: pythonmysqlsqlalchemy

解决方案


推荐阅读