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.
Nguồn
2016-06-14 10:15:35