[英]SQLAlchemy inheritance relations issue
我的 SQLAlchemy model 有一个基类 class Alpha
和两个派生类Beta
和Gamma
。 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()
我通过更改两行解决了这个问题:
gammas = relationship('Gamma', back_populates='beta', foreign_keys='Gamma.beta_id')
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.