使用复合外键时出现 SQLAlchemy InvalidRequestError
SQLAlchemy InvalidRequestError when using composite foreign keys
我在 SQLAlchemy 中的 table 关系变得相当复杂,现在无论我如何配置我的关系,我都会遇到这个错误。
我对 SQLAlchemy 有点陌生,所以我不确定自己做错了什么,但无论我做什么,我都会收到同样的错误。
我有一个 table 的层次结构,全部继承自 'Node',这是一个具有自引用 ID 和 parent_id 列的 table。所有这些都有效。现在我有另一个节点 table 'Information',它包含一个由不同节点 table、'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: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: Could not determine join condition between parent/child tables on relationship Widget.Information - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.
我尝试在小部件和信息端向关系添加 foreign_keys 参数,但我得到了完全相同的错误。有人可以帮忙吗?
经过大量搜索,我终于在 this 对另一个问题的回答中找到了一个非常简单的答案。
我所做的只是将 'inherit_condition': (id == Node.id)
添加到继承自 Node 的 类 中的映射器,使其看起来像这样:
__mapper_args__ = {'polymorphic_identity': 'Information',
'inherit_condition': (id == Node.id)}
而且效果很好。
我在 SQLAlchemy 中的 table 关系变得相当复杂,现在无论我如何配置我的关系,我都会遇到这个错误。
我对 SQLAlchemy 有点陌生,所以我不确定自己做错了什么,但无论我做什么,我都会收到同样的错误。
我有一个 table 的层次结构,全部继承自 'Node',这是一个具有自引用 ID 和 parent_id 列的 table。所有这些都有效。现在我有另一个节点 table 'Information',它包含一个由不同节点 table、'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: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: Could not determine join condition between parent/child tables on relationship Widget.Information - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.
我尝试在小部件和信息端向关系添加 foreign_keys 参数,但我得到了完全相同的错误。有人可以帮忙吗?
经过大量搜索,我终于在 this 对另一个问题的回答中找到了一个非常简单的答案。
我所做的只是将 'inherit_condition': (id == Node.id)
添加到继承自 Node 的 类 中的映射器,使其看起来像这样:
__mapper_args__ = {'polymorphic_identity': 'Information',
'inherit_condition': (id == Node.id)}
而且效果很好。