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

Dae*_*all 5 python sqlalchemy

在SQLAlchemy中,假设我们有一个Foo带有复合主键的表,并且Bar有两个外键约束链接它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)")
Run Code Online (Sandbox Code Playgroud)

谢谢.

van*_*van 2

关系()实际上无法确定其完整配置。当有不止一种方法来引用相关表时,总是会出现这种情况。
在您的示例中,似乎 sqlalchemy 可以足够智能地通过列的名称进行猜测,但这不是也不应该这样做。

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

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