Теперь у меня есть несколько таблиц из третьего программного обеспечения.
class A:
id = Column(Integer, primary_key=True)
class B:
id = Column(Integer, primary_key=True)
class C:
id = Column(Integer, primary_key=True)
class Link:
id = Column(Integer, primary_key=True)
src_id = Column(Integer)
src_type = Column(String) # such as 'A', 'B', 'C'
dst_id = Column(Integer)
dst_type = Column(String) # such as 'A', 'B', 'C'
Так, как я могу передать параметры отношениям, чтобы поддержать эту структуру? Теперь мое временное решение:
class Link:
...
src_a = relationship(A, foreign_keys=[src_id, src_type], primary_join=(src_type=='A') & (src_id = A.id))
src_b = relationship(B, foreign_keys=[src_id, src_type], primary_join=(src_type=='B') & (src_id = B.id))
src_c = relationship(C, foreign_keys=[src_id, src_type], primary_join=(src_type=='C') & (src_id = C.id))
dst_a = relationship(A, foreign_keys=[dst_id, dst_type], primary_join=(dst_type=='A') & (dst_id = A.id))
dst_b = relationship(B, foreign_keys=[dst_id, dst_type], primary_join=(dst_type=='B') & (dst_id = B.id))
dst_c = relationship(C, foreign_keys=[dst_id, dst_type], primary_join=(dst_type=='C') & (dst_id = C.id))
session.query(A, B).join(Link, Link.src_a.expression).join(B, Link.dst_b.expression)
Но да, это невозможно.