6 votes

SQLAlchemy : plusieurs clés étrangères pour une même table avec une clé primaire composée

Dans SQLAlchemy, imaginez que nous avons une table Foo avec une clé primaire composée, et Bar qui a deux contraintes de clé étrangère le reliant à Foo (chaque Bar a deux Foo objets).

Mon problème est le suivant relationship ce qui me fait répéter l'information (dans la fonction primaryjoin ) que j'ai déjà donné dans le ForeightKeyConstraint (violant DRY). Existe-t-il un autre moyen de structurer ce processus afin de ne pas avoir à répéter l'information ? Un moyen de transmettre les données pertinentes ForeignKeyConstraint a 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)")

Gracias.

2voto

van Points 18052

El relation() tel qu'il est, ne peut pas déterminer sa configuration complète. C'est toujours le cas lorsqu'il y a plus d'une façon de se référer au tableau correspondant.
Dans votre exemple, il semble que sqlalchemy pourrait être assez intelligent pour deviner par les noms des colonnes, mais ce n'est pas ce qu'il fait et il ne devrait pas le faire.

Bien qu'il puisse sembler que vous ayez des informations répétition en fait, vous êtes juste être précis sur la configuration de votre relation.

Il existe, en fait, une option permettant de spécifier foreign_keys en el relation() mais elle sert actuellement un objectif quelque peu différent, vous devrez donc toujours configurer primaryjoin .

1voto

jackotonye Points 36

Vous pouvez également utiliser foreign_keys et une liste de clés étrangères.

Voir Chemins d'accès multiples

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])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X