我在SQLAlchemy中的表关系变得非常复杂,现在无论我如何配置我的关系,我都会遇到这个错误。
我对SQLAlchemy有点新意,所以我不确定我做错了什么,但无论我做什么,我都会遇到同样的错误。
我有一个表层次结构,所有表都继承自'Node',这是一个具有自引用id和parent_id列的表。所有这一切都有效。现在我有另一个Node表'Information',它包含一个由不同Node表引用的复合主键'Widget'。
Base = declarative_base()
class Node(Base):
__tablename__ = 'Node'
id = Column(Integer, primary_key=True)
parentid = Column(Integer, ForeignKey('Node.ID')
type = Column(Text(50))
children = relationship('Node')
__mapper_args__ = {
'polymorphic_identity': 'Node',
'polymorphic_on': type
}
class Information(Node):
__tablename__ = 'Information'
id = Column(Integer, ForeignKey('Node.ID'), primary_key=True)
Name = Column(Text, primary_key=True)
Number = Column(Float, primary_key=True)
Widgets = relationship('Widget', backref='ThisInformation')
__mapper_args__ = {'polymorphic_identity': 'Information'}
class Widget(Node):
__tablename__ = 'Widget'
id = Column(Integer, ForeignKey('Node.ID'), primary_key=True)
Name = Column(Text)
UnitType = Column(Text)
Amount = Column(Float)
_Number = Column('Number', Float)
__table_args__ = (ForeignKeyConstraint(
['Name', 'Number'],
['Information.Name', 'Information.Number']),
{})
__mapper_args__ = {'polymorphic_identity': 'Widget'}
我担心这会给我一些循环引用问题,但它给了我这个错误:
InvalidRequestError:一个或多个映射器无法初始化 - 无法继续初始化其他映射器。原始异常是:无法确定关系Widget.Information上的父/子表之间的连接条件 - 有多个链接表的外键路径。指定'foreign_keys'参数,提供应列为包含父表的外键引用的列的列表。
我已尝试在Widget和Information端添加foreign_keys参数给关系,但我得到完全相同的错误。有人可以帮忙吗?
答案 0 :(得分:0)
经过大量的搜索,我终于在另一个问题的this回答中找到了一个非常简单的答案。
我所做的只是将'inherit_condition': (id == Node.id)
添加到从Node继承的类中的映射器中,使其看起来像这样:
__mapper_args__ = {'polymorphic_identity': 'Information',
'inherit_condition': (id == Node.id)}
它完美无缺。