2016-06-14 33 views

Trả lời

14

Thay vì xác định mức "lược đồ" mức ForeignKey các ràng buộc tạo custom foreign condition; chuyển những cột bạn muốn sử dụng làm "khóa ngoại" và primaryjoin thành relationship. Bạn phải xác định theo cách thủ công primaryjoin vì:

Theo mặc định, giá trị này được tính dựa trên mối quan hệ khóa ngoài của bảng cha và con (hoặc bảng liên kết).

In [2]: class A(Base): 
    ...:  a_id = Column(Integer, primary_key=True) 
    ...:  __tablename__ = 'a' 
    ...:  

In [3]: class C(Base): 
    ...:  c_id = Column(Integer, primary_key=True) 
    ...:  a_id = Column(Integer) 
    ...:  __tablename__ = 'c' 
    ...:  a = relationship('A', foreign_keys=[a_id], 
    ...:      primaryjoin='A.a_id == C.a_id') 
    ...:  

phím nước ngoài cũng có thể được chú thích inline trong primaryjoin sử dụng foreign():

a = relationship('A', primaryjoin='foreign(C.a_id) == A.a_id') 

Bạn có thể xác minh rằng không FOREIGN KEY hạn chế được phát ra cho bảng c:

In [4]: from sqlalchemy.schema import CreateTable 

In [5]: print(CreateTable(A.__table__)) 

CREATE TABLE a (
     a_id INTEGER NOT NULL, 
     PRIMARY KEY (a_id) 
) 



In [6]: print(CreateTable(C.__table__)) 

CREATE TABLE c (
     c_id INTEGER NOT NULL, 
     a_id INTEGER, 
     PRIMARY KEY (c_id) 
) 

Cảnh báo:

Lưu ý rằng không có ràng buộc FOREIGN KEY ở phía bên DB, bạn có thể thổi toàn vẹn tham chiếu của mình thành từng phần theo cách bạn muốn. Có một mối quan hệ ở cấp ORM/application, nhưng nó không thể được thực thi trong DB.

Các vấn đề liên quan