SQLAlchemy:具有复合主键的同一个表的多个外键

时间:2012-01-15 19:01:12

标签: python sqlalchemy

在SQLAlchemy中,假设我们有一个包含复合主键的表FooBar,它有两个外键约束将其链接到Foo(每个Bar有两个Foo个对象。

我的问题在于relationship功能,这使我重复primaryjoin中已经提供的信息(在ForeightKeyConstraint中)(违反DRY)。是否有其他一种结构方式,以便我不必重复信息?将相关ForeignKeyConstraint传递给relationship

的一些方法
class Foo(Base):
    __tablename__ = "Foo"
    id_1 = Column(Integer, primary_key=True)
    id_2 = Column(Integer, primary_key=True)

class Bar(Base):
    __tablename__ = "Bar"
    id = Column(Integer, primary_key=True)

    foo_1_id_1 = Column(Integer)
    foo_1_id_2 = Column(Integer)

    foo_2_id_1 = Column(Integer)
    foo_2_id_2 = Column(Integer)

    __table_args__ = (
            ForeignKeyConstraint(
                [foo_1_id_1,foo_1_id_2],
                [Foo.id_1,Foo.id_2]
                ),
            ForeignKeyConstraint(
                [foo_2_id_1,foo_2_id_2],
                [Foo.id_1,Foo.id_2]
                )
            )

    foo_1 = relationship(Foo,primaryjoin="(Bar.foo_1_id_1 == Foo.id_1) & (Bar.foo_1_id_2 == Foo.id_2)")
    foo_2 = relationship(Foo,primaryjoin="(Bar.foo_2_id_1 == Foo.id_1) & (Bar.foo_2_id_2 == Foo.id_2)")

感谢。

2 个答案:

答案 0 :(得分:2)

relationship()实际上无法确定其完整配置。当有多种方式引用相关表格时,情况总是如此 在你的例子中,看起来sqlalchemy可能足够聪明,可以通过列的名称来猜测,但这不是什么,它不应该。

虽然看起来好像有重复信息,但实际上您只是具体关于您的关系配置。

事实上,可以选择在relationship()配置中指定foreign_keys,但目前的用途有所不同,因此您仍需要配置primaryjoin

答案 1 :(得分:0)

您还可以使用foreign_keys和外键列表。

请参阅Multiple Join Paths

foo_1 = relationship(Foo, foreign_keys=[foo_1_id_1, foo_2_id_2])
foo_2 = relationship(Foo, foreign_keys=[foo_2_id_1, foo_2_id_2])