在我有一些表格来自第三个软件。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)但是,是的,这是无法维护的。
1 回答

慕哥6287543
TA贡献1831条经验 获得超10个赞
这看起来就像一般关系的sqlalchemy_utils,通过它可以有:
from sqlalchemy_utils import generic_relationship
class Link:
...
src = generic_relationship(src_type, src_id)
dst = generic_relationship(dst_type, dst_id)
添加回答
举报
0/150
提交
取消