使用复合外键时SQLAlchemy InvalidRequestError

时间:2015-03-24 16:42:00

标签: python sqlalchemy

我在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参数给关系,但我得到完全相同的错误。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

经过大量的搜索,我终于在另一个问题的this回答中找到了一个非常简单的答案。

我所做的只是将'inherit_condition': (id == Node.id)添加到从Node继承的类中的映射器中,使其看起来像这样:

__mapper_args__ = {'polymorphic_identity': 'Information',
                   'inherit_condition': (id == Node.id)}

它完美无缺。