Как поддержать ManyTableToManyTable связями с SQLAlchemy? - PullRequest
0 голосов
/ 09 ноября 2018

Теперь у меня есть несколько таблиц из третьего программного обеспечения.

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 Ответ

0 голосов
/ 09 ноября 2018

Это выглядит как Родовые отношения из sqlalchemy_utils, с которыми вы можете иметь:

from sqlalchemy_utils import generic_relationship

class Link:
    ...
    src = generic_relationship(src_type, src_id)
    dst = generic_relationship(dst_type, dst_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...