【发布时间】:2017-04-26 08:54:05
【问题描述】:
我有一个带有两个外键的 sqlalchemy 实体,因为它可以有两个完全不同的父级之一。让我们使用 Address、Customer 和 Supplier 来进行说明。 Address 可以属于 Customer 或 Supplier(在我的情况下可以有孩子)。
我希望地址及其子代在其父代为零时自动删除,即 Customer 和 Supplier 均未提及它。
我最初是这样实现的
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
customer_id = Column(Integer, ForeignKey('customers.id')
supplier_id = Column(Integer, ForeignKey('suppliers.id')
# etc ...
根据 sqlalchemy 文档,实现 Generic Associations 的规范方法是使用 table-per-related 或 table-per-association。不过,这两个似乎都没有解决删除级联的问题:
- table-per-related:因为 Address 有它自己的孩子,我必须复制每个相关的地址下面的整个层次结构。否则问题只会转移到 Address 的孩子身上
- table-per-association:在 Address 上安装了反向引用,这似乎与我的初始实现相同,只是现在直接父级是关联表中的行。我看不出
delete-orphan在这里如何工作。
在 sqlalchemy 中使用泛型关联处理 delete-orphan 级联的正确方法是什么?
【问题讨论】:
标签: python sqlalchemy