我不清楚如何为以下场景配置 SQLAlchemy:
- 几张不同性质的桌子。
- 所有表都需要引用一对多
notes
表 - 希望只有一个
notes
表,为所有其他表提供服务,关系基于表parent_type
中的列notes
例如:if relation_type
is items,则relationship_id
指table_items
表的PK。如果relation_type
是订单那么relationship_id
会指PK的table_orders
我不清楚如何为以下场景配置 SQLAlchemy:
notes
表notes
表,为所有其他表提供服务,关系基于表parent_type
中的列notes
例如:if relation_type
is items,则relationship_id
指table_items
表的PK。如果relation_type
是订单那么relationship_id
会指PK的table_orders
要回答您的确切问题(我认为),您可以在每个模型上放置一个指定主要连接条件的关系,但您将无法管理外键 relationship_id 的完整性。Order 模型上的这种关系可能如下所示:
notes = relationship('Note', backref="order", primaryjoin="and_(Note.relationship_id == Order.id, relationship_type == 'orders')")
但为了保持外键的完整性,我建议采用两种方法之一。首先,您可以使用单表继承并将所有 fk 放在注释表中,例如:
id INT
relationship_type VARCHAR
item_id INT REFERENCES items.id
orders INT REFERENCES orders.id
objects INT REFERENCES objects.id
然后你可以做一些类似员工、经理等的例子,但对于 item_notes、order_notes 和 object_notes:
http://docs.sqlalchemy.org/en/rel_0_8/orm/inheritance.html#single-table-inheritance
第二种方法是在每个可以有注释的表中放置一个外键。外键将指向代表一组注释的新表。
特别是在这种情况下,您需要在 items、orders 和 objects 表中添加一个 note_group_id 列。然后新建表note_groups,并在notes表中创建note_group_id列。
然后,如果需要,note_groups 表可以有一个引用项目、订单或对象的类型列。您可以通过将类型添加到 relationship() 的 primaryjoin 参数来提高一对一关系的准确性。关系的完整性不是很好,但我认为对于简单的笔记来说已经足够了。
note_group = relationship('NoteGroup', uselist=False, backref="item", primaryjoin="and_(Item.note_group_id == NoteGroup.id, NoteGroup.type == 'items')")
对于第二种方法,您不需要继承,它只是一对一的关系(从任何可以有 note_groups 表的注释的表)和从 note_groups 表到 notes 表的一对多关系。
还有更多方法,但我认为这是最简单的两种。希望其他人有更多的建议。