2012-04-12 2 views
2

Wenn ich ein Element kaskadieren lösche ich eine Liste aller gelöschten Elemente ID (Primärschlüssel) einschließlich IDs der gelöschten Kinder. Ist es möglich?Wie kann ich ID von Kaskade löschen (oder zum Löschen markiert) Elemente in sqlalchemy?

sieht Meine Klasse wie:

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")) 

und ich fragen wie:

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

Es gibt keine Lösung in Python-Ebene durch sqlalchemy? – JalilDotMe

Antwort

1

Die einzige wirkliche Lösung, die ich kenne, ist Auslöser zu verwenden. Es gibt einen generalisierten Auslöser für die Behandlung genau dieser Art von Problem, der als eine installierbare Erweiterung für 9.2 (die voraussichtlich diesen Sommer veröffentlicht wird) an das PostgreSQL-Projekt übergeben wurde. Wenn Ihre Python-Umgebung die LISTEN/NOTIFY-Funktion von PostgreSQL unterstützt, können Sie diese herunterladen und mit 9.1 oder 9.0 verwenden. (Wir [das Wisconsin-Gerichtssystem] haben es seit Monaten in der Produktion mit beiden verwendet.) Sie müssten es in der Lage sein, es aus der Quelle zu bauen, fürchte ich, bis Version 9.2 veröffentlicht wird. Wenn Sie nicht zuvor getan haben, sollten die unten auf dieser Seite ein guter Anfang sein:

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

Sie Quellcode für die Erweiterung finden Sie hier:

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

.. ., und Sie können zur Zeit docs finden Sie hier:

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

Sie müssen Erstellen Sie einen Trigger, der diese Triggerfunktion für jede Tabelle ausführt, für die Sie eine Benachrichtigung wünschen. Es spielt keine Rolle, ob die DML direkt oder indirekt ist, etwa durch die ON DELETE CASCADE-Klausel einer Fremdschlüsseldefinition. Während die docs ein Beispiel zu geben, wo die Funktion zu alle DML angeschlossen ist, können Sie es anhängen nur zu löschen, wenn das ist, was Sie benötigen, wie folgt aus:

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

Vollständige Offenlegung: Ich schrieb dies für die Wisconsin Gericht System und sie erlaubten mir, es mit der PostgreSQL-Gemeinschaft zu teilen.

Verwandte Themen