首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >SQLAlchemy:级联删除

SQLAlchemy:级联删除
EN

Stack Overflow用户
提问于 2011-02-18 03:22:54
回答 6查看 101.5K关注 0票数 148

我肯定遗漏了SQLAlchemy的级联选项中的一些微不足道的东西,因为我不能通过简单的级联删除来正确操作--如果父元素是deleted,那么子元素将使用null外键保持不变。

我在这里放了一个简明的测试用例:

代码语言:javascript
复制
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()

输出:

代码语言:javascript
复制
Before delete, children = 3
Before delete, parent = 1
After delete, children = 3
After delete parent = 0

在Parent和Child之间存在一种简单的一对多关系。该脚本创建一个父对象,添加3个子对象,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使子节点级联删除?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5033547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档