SQLAlchemy: несколько внешних ключей к одной таблице с составным первичным ключом - PullRequest
5 голосов
/ 15 января 2012

Представьте себе, что в 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)")

Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 января 2012

Отношение () не может определить его полную конфигурацию. Это всегда тот случай, когда есть несколько способов обратиться к соответствующей таблице.
В вашем примере кажется, что sqlalchemy может быть достаточно умным, чтобы догадаться по именам столбцов, но это не то, что делает и не должно.

Хотя может показаться, что у вас есть информация повтор , на самом деле вы просто конкретны относительно своей конфигурации отношений.

На самом деле существует опция для указания foreign_keys в конфигурации Relationship () , но в настоящее время она служит несколько иной цели, поэтому вам все равно нужно будет настроить primaryjoin.

0 голосов
/ 13 января 2017

Вы также можете использовать foreign_keys и список внешних ключей.

См. Несколько путей соединения

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...