SQLAlchemy의 캐스케이드 옵션으로 사소한 것이 누락되어 있어야합니다. 왜냐하면 간단한 캐스케이드 삭제를 올바르게 작동 할 수 없기 때문입니다. 상위 요소가 삭제되면 하위 요소는 null
외래 키 와 함께 유지됩니다 .
여기에 간결한 테스트 케이스를 넣었습니다.
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()
산출:
Before delete, children = 3
Before delete, parent = 1
After delete, children = 3
After delete parent = 0
부모와 자식 간에는 단순한 일대 다 관계가 있습니다. 스크립트는 부모를 만들고 3 개의 자식을 추가 한 다음 커밋합니다. 다음으로 부모를 삭제하지만 자식은 유지됩니다. 왜? 하위 항목을 계단식으로 삭제하려면 어떻게해야합니까?