Как можно получить прослушиватель событий, который запускается при каскадном удалении в sqlalchemy? - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть несколько моделей в SQLAlchemy, и мне нужно выполнять действие (удаление файла с диска) всякий раз, когда удаляется запись, связанная с этим файлом. Однако привязка слушателя к событию 'remove' для этого объекта не помогает.

Пример:

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)

Указанный выше слушатель никогда не вызывается при отправке запроса DELETE. на столе modela. Как я могу сделать так, чтобы sqlalchemy обрабатывал такие каскадные удаления и вызывал мой слушатель событий всякий раз, когда удаление отправляется в родительскую таблицу?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...