【问题标题】:SQLAlchemy variable relationshipSQLAlchemy 变量关系
【发布时间】:2013-05-22 17:42:09
【问题描述】:

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

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

例如:如果relation_typeitems,那么relationship_id指的是table_items表的PK。如果relation_typeorders 那么relationship_id 将引用table_orders 的PK

【问题讨论】:

  • 这看起来很像 Rails STI 设置。至少遇到过这个问题。

标签: python orm sqlalchemy relationship


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    第二种方法是在每个可以有注释的表中放置一个外键。外键将指向代表一组注释的新表。

    特别是在这种情况下,您需要将 note_group_id 列添加到 items、orders 和 objects 表中。然后新建表note_groups,并在notes表中创建note_group_id列。

    然后,如果需要,note_groups 表可以有一个 type 列来引用项目、订单或对象。您可以通过将类型添加到 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 表的一对多关系。

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

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 1970-01-01
      • 2013-10-22
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      • 2022-01-01
      • 2015-04-08
      相关资源
      最近更新 更多