2012-04-12 1 views
2

Когда я каскадом удаляю один элемент, я хочу получить список всех удаленных элементов id (первичный ключ), включая идентификаторы удаленных детей. Является ли это возможным?Как я могу получить идентификатор каскада удаленных (или помеченных для удаления) элементов в sqlalchemy?

Мой класс выглядит следующим образом:

class Example(Base): 
    __tablename__ = 'example' 
    id = Column(Integer, primary_key=True) 
    parent_id = Column(Integer, ForeignKey('example.id', ondelete='CASCADE'), nullable=True) 
    childrens = relationship('Example', backref=backref('parent', remote_side=[id], cascade="all, delete")) 

и я запрашиваю как:

session.query(Example).filter(Example.id == id).delete() 
+0

Нет решения на уровне Python через sqlalchemy? – JalilDotMe

ответ

1

Единственное реальное решение, которое я знаю, это использовать триггеры. Существует обобщенный триггер для решения только такого типа проблем, который был включен в проект PostgreSQL в качестве устанавливаемого расширения для 9.2 (ожидается, что он будет выпущен этим летом). Если ваша среда python поддерживает функцию PostgreSQL LISTEN/NOTIFY, вы можете загрузить ее и использовать ее с 9.1 или 9.0. (Мы [судебная система Висконсина] использовали его в производственных целях как в течение нескольких месяцев.) Боюсь, что вам нужно будет построить его из источника, пока не будет выпущена версия 9.2. Если вы еще не сделали этого раньше, в нижней части этой страницы должно быть хорошее начало:

http://www.postgresql.org/docs/devel/static/contrib.html

Вы можете найти исходный код для расширения здесь:

http://git.postgresql.org/gitweb/?p=postgresql.git;a=tree;f=contrib/tcn;h=aa9c5813223a3996e22cabbf064d7243fa474c6c;hb=HEAD

.. ., и вы можете найти себе документы здесь:

http://www.postgresql.org/docs/devel/static/tcn.html

вы должны были бы создайте триггер, который выполняет эту триггерную функцию для каждой таблицы, для которой вы хотите получить уведомление. Не имеет значения, является ли DML прямым или косвенным, как в случае ON DELETE CASCADE определения внешнего ключа. В то время как документы дают пример, когда функция прикрепленную к все DML, вы можете прикрепить его просто удалить, если это то, что вам нужно, например:

create trigger example_tcn_trigger 
    after delete on example 
    for each row execute procedure triggered_change_notification(); 

Полное раскрытие: я написал это для суда Висконсин и они позволили мне поделиться им с сообществом PostgreSQL.