繁体   English   中英

SQLAlchemy inheritance关系问题

[英]SQLAlchemy inheritance relations issue

我的 SQLAlchemy model 有一个基类 class Alpha和两个派生类BetaGamma Beta也是Beta的一个字段。 我的实施导致以下消息错误。 如何解决此连接条件问题?

AmbiguousForeignKeysError:无法确定关系 Beta.gammas 上的父/子表之间的连接条件 - 有多个外键路径链接表。 指定 'foreign_keys' 参数,提供应计为包含对父表的外键引用的那些列的列表。

class Alpha(declarative_base()):
    __tablename__ = 'alpha'

    id_ = Column(Integer, primary_key=True)
    data = Column(Integer)
    type_ = Column(String(50))

    __mapper_args__ = {
        "polymorphic_identity": "alpha",
        "polymorphic_on": type_,
    }

class Beta(Alpha):
    __tablename__ = 'beta'

    id_ = Column(Integer, ForeignKey('alpha.id_'), primary_key=True)
    foo = Column(Integer)

    # Related
    gammas = relationship('Gamma', back_populates='beta')

    __mapper_args__ = {
        "polymorphic_identity": 'beta',
    }

class Gamma(Alpha):
    __tablename__ = 'gamma'

    id_ = Column(Integer, ForeignKey('alpha.id_'), primary_key=True)
    bar = Column(Integer)

    beta_id = Column(Integer, ForeignKey('beta.id_'))
    beta = relationship('Beta', back_populates='gammas')

    __mapper_args__ = {
        "polymorphic_identity": 'gamma',
    }

declarative_base().metadata.create_all(engine, checkfirst=True)
beta = Beta()

我通过更改两行解决了这个问题:

  1. gammas = relationship('Gamma', back_populates='beta', foreign_keys='Gamma.beta_id')
  2. beta = relationship('Beta', back_populates='gammas', foreign_keys=[beta_id])

因此,完整的新代码变为:

class Alpha(declarative_base()):
    __tablename__ = 'alpha'

    id_ = Column(Integer, primary_key=True)
    data = Column(Integer)
    type_ = Column(String(50))

    __mapper_args__ = {
        "polymorphic_identity": "alpha",
        "polymorphic_on": type_,
    }

class Beta(Alpha):
    __tablename__ = 'beta'

    id_ = Column(Integer, ForeignKey('alpha.id_'), primary_key=True)
    foo = Column(Integer)

    # Related
    gammas = relationship('Gamma', back_populates='beta', foreign_keys='Gamma.beta_id')

    __mapper_args__ = {
        "polymorphic_identity": 'beta',
    }

class Gamma(Alpha):
    __tablename__ = 'gamma'

    id_ = Column(Integer, ForeignKey('alpha.id_'), primary_key=True)
    bar = Column(Integer)

    beta_id = Column(Integer, ForeignKey('beta.id_'))
    beta = relationship('Beta', back_populates='gammas', foreign_keys=[beta_id])

    __mapper_args__ = {
        "polymorphic_identity": 'gamma',
    }

declarative_base().metadata.create_all(engine, checkfirst=True)
beta = Beta()

https://docs.sqlalchemy.org/en/14/orm/join_conditions.html#handling-multiple-join-paths中的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM