Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何取消childre';使用sqlalchemy删除父项时的外键?_Python_Postgresql_Sqlalchemy - Fatal编程技术网

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)