Python 如何取消childre';使用sqlalchemy删除父项时的外键?
我有一个基本的烧瓶应用程序,它有Python 如何取消childre';使用sqlalchemy删除父项时的外键?,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我有一个基本的烧瓶应用程序,它有Parent和Child这样的型号: class Parent(db.Model): __tablename__ = 'parents' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String) class Child(db.Model): __tablename__ = 'children' id = db.Column(db.
Parent
和Child
这样的型号:
class Parent(db.Model):
__tablename__ = 'parents'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
class Child(db.Model):
__tablename__ = 'children'
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parents.id'), nullable=False)
parent = db.relationship('Parent', backref=db.backref('children', cascade='all,delete'))
name = db.Column(db.String)
作为数据库,如果重要的话,我会使用Postgres。
现在,我想做以下操作:删除cascade='all,从child中删除'
,并使这个parent\u id
为空。也就是说,当从数据库中删除Parent
时Child
保持在Parent\u id==NULL
的位置
我知道我可以通过向FK添加约束的模式创建脚本来指定它。但我只想将其标记为NULL
,并允许SqlAlchemy控制儿童FK的无效性。文档的后面详细解释了这一点。确保您还阅读了删除“级联”部分中的“ORM级别”删除“级联与外键级别”,以了解建议解决方案之间的差异
ORM级别
现在,我想做以下操作:删除cascade='all,从child中删除'
,并使这个parent\u id
为空
这样做,你就会得到你想要的准确行为
class Child(db.Model):
__tablename__ = 'children'
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parents.id'), nullable=True)
parent = db.relationship('Parent', backref=db.backref('children'))
name = db.Column(db.String)
还要注意的是,all
是save update、merge、refresh expire、expunge、delete
的同义词,因此all、delete
与简单的all
相同
分贝级
如果要在数据库级别上设置ON DELETE NULL
约束,可以在ForeighKey
定义中指定或不执行任何操作(因为这是外键的默认行为)。要使其在DB级别上工作,还需要将其设置为True
或'all'
(有关差异,请参阅文档)
class Child(db.Model):
__tablename__ = 'children'
id = db.Column(db.Integer, primary_key=True)
parent_id = db.Column(db.Integer, db.ForeignKey('parents.id', ondelete='SET NULL'), nullable=True)
parent = db.relationship('Parent', backref=db.backref('children', passive_deletes=True))
name = db.Column(db.String)