如何删除与 SQLAlchemy 的一对一关系

bbe*_*ort 10 python sqlalchemy flask-sqlalchemy

我想创建一个可为空的自引用关系,可以使用 SQLAlchemy 删除该关系。示例模型如下(注意,使用Flask-SQLAlchemy):

class Person(db.Model):

    __tablename__ = 'person'

    id          = db.Column(db.Integer, primary_key=True)
    partner_id  = db.Column(db.Integer, db.ForeignKey('person.id'), nullable=True)
    partner     = db.relationship('Person', uselist=False)
Run Code Online (Sandbox Code Playgroud)

因此,可以将其想象为一桌只有一个搭档的警察,但该搭档可能原来一直是黑手党的成员,因此他们暂时失去了搭档。没有伴侣的警察很好,至少在数据库方面是这样——但我认为在整个演出过程中,他们没有伴侣的状态意味着大量的财产损失。

不用说,这个问题:sqlalchemy:带有声明性的一对一关系讨论了如何建立这种关系。问题是如何解除这种关系?通常,使用不同的外键,您可以按如下方式执行此操作:

joe.partner.remove(larry)
Run Code Online (Sandbox Code Playgroud)

其中joelarry都是Person对象。然而,经过uselist论证,joe.partner现在其实是一个Person没有remove办法的事情。

Jug*_*ish 3

如何删除一对一关系隐藏在 SQLAlchemy 文档中 Cascades 的解释下: https: //docs.sqlalchemy.org/en/14/orm/cascades.html#notes-on-delete-deleting-从集合和标量关系引用的对象

删除孤立级联还可以应用于多对一或 一对一关系,以便当一个对象与其父对象解除关联时,它也会自动标记为删除。在多对一或一对一上使用删除孤立级联需要额外的标志关系。single_parent 调用一个断言,表明此相关对象不会同时与任何其他父级共享

因此,您需要像这样建立一对一关系:

partner = db.relationship(
    'Person',
    cascade='all, delete-orphan',
    uselist=False,
    single_parent=True,
)
Run Code Online (Sandbox Code Playgroud)

然后,删除一个人的伙伴只需将其设置为 None 即可:

some_person.partner = None
session.flush()  # will delete the partner object
Run Code Online (Sandbox Code Playgroud)