2012-01-15 3 views
5

와 같은 테이블에 여러 외래 키는 각 BarFoo 개체가 (Foo에 연결하는 두 개의 외래 키 제약을을 가지고있는 Bar을 우리가 복합 기본 키가있는 테이블 Foo을 상상하고,).SQLAlchemy의 : SQLAlchemy의 복합 기본 키

내 문제는 내가 ForeightKeyConstraint (DRY를 위반)에서 이미 제공 한 정보 (primaryjoin)를 반복하게하는 relationship 기능과 관련된 것입니다. 정보를 반복 할 필요가 없도록 이것을 구조화하는 다른 방법이 있습니까? 관련 ForeignKeyConstraintrelationship에 전달하는 몇 가지 방법이 있습니까?

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

relationship()은 그대로 전체 구성을 결정할 수 없습니다. 관련 테이블을 참조하는 방법이 여러 가지 일 때 항상 그렇습니다.
예제에서 볼 때 sqlalchemy는 열의 이름을 추측 할 정도로 똑똑 할 수 있지만 실제로는 그렇지 않습니다.

당신이 방금 관계 구성에 대한 특정되고있다 사실, 정보 를 반복이있는 경우로 보일 수도 있지만.

relationship() 구성에 foreign_keys을 지정하는 옵션이 있지만 실제로는 다소 다른 용도로 사용되기 때문에 여전히 primaryjoin을 구성해야합니다.

+0

감사를 참조하십시오. 그러나 반복됩니다. 'ForeignKeyConstraint'를 사용할 지 알지 못합니다. 하지만 예를 들어, 관계형에 관련된 'ForeignKeyConstraint'에 대한 참조를 어떻게 든 부여 할 수 있고, 주어진 테이블에 'ForeignKeyConstraint'가 하나 밖에없는 경우처럼 자체에 대한 조인 식을 알아낼 수 있다면, 그러면 조인의 세부 사항이 반복적으로 제거됩니다. – DaedalusFall

+0

사실, 언급했듯이 foreign_keys를 관계에 제공 할 가능성이 있지만 현재는 'primaryjoin' 조건을 유추하는 데 사용되지 않습니다. 당신의 경우는 이런 식으로 사용될 수있는 좋은 본보기입니다. 그러나 대답에서 언급했듯이, * 현재 * 그렇지 않습니다. 하지만 http://www.sqlalchemy.org/trac/에서 기능 요청 티켓을 만들지 마십시오. – van

+0

나는 그 때까지 분명히 뭔가를 놓치지 않았 으면 좋겠다. 내 SQLAlchemy의 불황! – DaedalusFall

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