2012-01-15 35 views
5

Trong SQLAlchemy, hãy tưởng tượng chúng ta có một bảng Foo với một khóa chính hợp chất, và Bar, trong đó có hai ép chính nước ngoài liên kết nó để Foo (mỗi Bar có hai Foo đối tượng).SQLAlchemy: Nhiều phím nước ngoài để cùng bảng với hợp chất chính chủ chốt

Vấn đề của tôi là với chức năng relationship, làm cho tôi lặp lại thông tin (trong số primaryjoin) mà tôi đã đưa ra trong ForeightKeyConstraint (vi phạm DRY). Có cách nào khác để cấu trúc điều này để tôi không phải lặp lại thông tin? Một số cách để chuyển số ForeignKeyConstraint có liên quan đến 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)") 

Cảm ơn.

Trả lời

2

relationship(), vì nó, không thể xác định cấu hình đầy đủ của nó. Điều này luôn luôn xảy ra khi có nhiều cách để tham khảo bảng liên quan.
Trong ví dụ của bạn có vẻ như sqlalchemy có thể đủ thông minh để đoán tên của các cột, nhưng đây không phải là những gì hiện và nó không nên.

Mặc dù có vẻ như bạn có thông tin lặp lại, trên thực tế bạn chỉ cần cụ thể là về cấu hình quan hệ của bạn.

Có, trên thực tế, tùy chọn để chỉ định foreign_keys trong cấu hình relationship(), nhưng hiện đang phục vụ cho mục đích khác, vì vậy bạn sẽ cần phải định cấu hình primaryjoin.

+0

Cảm ơn. Nhưng có IS lặp lại. Tôi nhận ra rằng nó không biết 'ForeignKeyConstraint' để sử dụng. Nhưng nếu, ví dụ tôi bằng cách nào đó có thể đưa ra một tham chiếu đến 'ForeignKeyConstraint' có liên quan đến' mối quan hệ', và nó có thể tìm ra biểu thức kết nối cho chính nó (giống như khi chỉ có một 'ForeignKeyConstraint' đến bảng đã cho) sau đó điều đó sẽ loại bỏ sự lặp lại các chi tiết của việc tham gia. – DaedalusFall

+0

Đúng, và trên thực tế, như đã đề cập, có khả năng cung cấp 'ngoại lệ 'cho mối quan hệ, nhưng hiện tại nó không được sử dụng để suy ra điều kiện' primaryjoin'. Trường hợp của bạn là ví dụ tốt nơi nó có thể được sử dụng theo cách này. Nhưng như đã đề cập trong câu trả lời, * hiện tại * nó không có. Nhưng tại sao bạn không tạo một vé yêu cầu tính năng trên http://www.sqlalchemy.org/trac/ – van

+0

Tôi sẽ làm như vậy, Muốn đảm bảo rằng tôi đã không bỏ lỡ một điều gì đó hiển nhiên, mà chủ yếu là trường hợp cho đến nay với những rắc rối SQLAlchemy của tôi! – DaedalusFall

0

Bạn cũng có thể sử dụng foreign_keys và danh sách Khóa ngoại.

Xem 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]) 
Các vấn đề liên quan