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)
其中joe和larry都是Person对象。然而,经过uselist论证,joe.partner现在其实是一个Person没有remove办法的事情。
如何删除一对一关系隐藏在 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)
| 归档时间: |
|
| 查看次数: |
2769 次 |
| 最近记录: |