1

我不清楚如何为以下场景配置 SQLAlchemy:

  • 几张不同性质的桌子。
  • 所有表都需要引用一对多notes
  • 希望只有一个notes表,为所有其他表提供服务,关系基于表parent_type中的列notes

表格图

例如:if relation_typeis items,则relationship_idtable_items表的PK。如果relation_type订单那么relationship_id会指PK的table_orders

4

2 回答 2

2

IMO,您描述的问题最好使用通用关联示例来解决。列出
的三个示例中最接近的示例是discriminator_on_association.py

于 2013-05-30T21:07:06.503 回答
1

要回答您的确切问题(我认为),您可以在每个模型上放置一个指定主要连接条件的关系,但您将无法管理外键 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 表的一对多关系。

还有更多方法,但我认为这是最简单的两种。希望其他人有更多的建议。

于 2013-05-28T18:54:18.710 回答