我必须在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()) …Run Code Online (Sandbox Code Playgroud) 我准备了一个演示问题的小提琴.
CREATE TABLE parent (
parent_id integer primary key
);
CREATE TABLE child (
child_name TEXT primary key,
parent_id integer REFERENCES parent (parent_id) ON DELETE CASCADE
);
INSERT INTO parent VALUES (1);
INSERT INTO child VALUES ('michael',1), ('vanessa', 1);
Run Code Online (Sandbox Code Playgroud)
我想要一种删除子记录时删除CASCADE到父记录的方法.
例如:
DELETE FROM child WHERE child_name='michael';
Run Code Online (Sandbox Code Playgroud)
这应该级联到父表并删除记录.