【发布时间】:2011-06-29 08:18:18
【问题描述】:
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
Parent 和 Child 之间存在简单的一对多关系。该脚本创建一个父级,添加 3 个子级,然后提交。接下来,它会删除父级,但子级仍然存在。为什么?如何让子级级联删除?
【问题讨论】:
-
文档中的这一部分(至少现在,在原始帖子之后的 3 年后)似乎对此很有帮助:docs.sqlalchemy.org/en/rel_0_9/orm/session.html#cascades
-
我认为
session.delete(parent)之后的session.commit()是不必要的。
标签: python database sqlalchemy