SQLAlchemy变量关系

时间:2013-05-27 20:53:50

标签: python orm sqlalchemy relationship

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

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

Table Diagram

例如:如果relation_type,则relationship_id指的是table_items表的PK。如果relation_type 订单,则relationship_id会引用table_orders的PK

2 个答案:

答案 0 :(得分:2)

IMO,您描述的问题最好使用Generic Associations示例解决 三个examples listed中最接近的示例是discriminator_on_association.py

答案 1 :(得分:1)

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

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