SQLAlchemy: supprimer en cascade

Je doit manquer quelque chose de trivial avec SQLAlchemy de la cascade d'options que je ne peux pas obtenir un simple supprimer en cascade pour fonctionner correctement-si un parent de l'élément est supprimé, les enfants persistent, avec null clés étrangères.

J'ai mis un concis de cas de test ici:

from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.orm import relationship

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Parent(Base):
    __tablename__ = "parent"
    id = Column(Integer, primary_key = True)

class Child(Base):
    __tablename__ = "child"
    id = Column(Integer, primary_key = True)
    parentid = Column(Integer, ForeignKey(Parent.id))
    parent = relationship(Parent, cascade = "all,delete", backref = "children")

engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)

session = Session()

parent = Parent()
parent.children.append(Child())
parent.children.append(Child())
parent.children.append(Child())

session.add(parent)
session.commit()

print "Before delete, children = {0}".format(session.query(Child).count())
print "Before delete, parent = {0}".format(session.query(Parent).count())

session.delete(parent)
session.commit()

print "After delete, children = {0}".format(session.query(Child).count())
print "After delete parent = {0}".format(session.query(Parent).count())

session.close()

De sortie:

Before delete, children = 3
Before delete, parent = 1
After delete, children = 3
After delete parent = 0

Il est un simple, un-à-plusieurs relation entre le Parent et l'Enfant. Le script crée un parent, ajoute 3 enfants, puis s'engage. Ensuite, il supprime les parents, mais les enfants persistent. Pourquoi? Comment puis-je rendre les enfants effacer en cascade?

InformationsquelleAutor carl | 2011-02-17