如何通过与 SQLAlchemy 的关系支持 ManyTableToManyTable?

在我有一些表格来自第三个软件。


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)

但是,是的,这是无法维护的。


繁花如伊
浏览 161回答 1
1回答

慕哥6287543

这看起来就像一般关系的sqlalchemy_utils,通过它可以有:from sqlalchemy_utils import generic_relationshipclass Link:    ...    src = generic_relationship(src_type, src_id)    dst = generic_relationship(dst_type, dst_id)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python