使用复合外键时出现 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)}

而且效果很好。