2012-01-15 118 views
5

在SQLAlchemy中,假設我們有一個表Foo用複合主鍵,Bar,其中有連接這兩個外鍵約束,以Foo(每個Bar有兩個Foo對象)。SQLAlchemy的:多個外鍵同桌複合主鍵

我的問題是與relationship函數,這使我重複我已經在ForeightKeyConstraint(違反DRY)給出的信息(在primaryjoin)。有沒有其他的方式來構造這個,以便我不必重複信息?某種方式將相關的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

relationship(),因爲它無法確定其完整配置。當有多種方法參考相關表格時,情況總是如此。
在你的例子中,sqlalchemy似乎足夠聰明,可以根據列的名稱進行猜測,但這不是什麼,也不應該。

雖然看起來那麼如果你有信息重複,其實你只是是特定你的關係配置。

實際上,在relationship()配置中有指定foreign_keys的選項,但目前服務的用途有所不同,因此您仍需要配置primaryjoin

+0

感謝。但是有重複。我意識到它不知道要使用哪個'ForeignKeyConstraint'。但是,例如,我可以以某種方式給「關係」引用相關的'ForeignKeyConstraint',並且它可以找出它自己的連接表達式(就像它在給定表中只有一個'ForeignKeyConstraint'時一樣)那麼這將消除連接細節的重複。 – DaedalusFall 2012-01-15 23:36:30

+0

確實如此,實際上,如上所述,可以爲關係提供'foreign_keys',但目前它不用於推斷'primaryjoin'條件。你的情況就是一個很好的例子,它可以以這種方式使用。但正如答案中提到的那樣,*目前*它沒有。但是,爲什麼你不在http://www.sqlalchemy.org/trac/ – van 2012-01-16 07:40:44

+0

上創建一個功能請求票據,然後我想要確保我沒有失去一些明顯的東西,到目前爲止大部分都是這樣我的SQLAlchemy困境! – DaedalusFall 2012-01-16 13:13:34

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