Python SQLAlchemy:通过一对一关系连接继承

Python SQLAlchemy:通过一对一关系连接继承,python,inheritance,sqlalchemy,one-to-one,Python,Inheritance,Sqlalchemy,One To One,我试图用SQLAlchemy实现以下结构:Box和Item都是元素s,并且Box有一个项 类别定义如下: class Element(Base): __tablename__ = 'element' id = Column(Integer, primary_key=True) el_type = Column(String) __mapper_args__ = dict( polymorphic_identity='element',

我试图用SQLAlchemy实现以下结构:
Box
Item
都是
元素
s,并且
Box
有一个

类别定义如下:

class Element(Base):
    __tablename__ = 'element'

    id = Column(Integer, primary_key=True)
    el_type = Column(String)

    __mapper_args__ = dict(
        polymorphic_identity='element',
        polymorphic_on=el_type,
    )

class Box(Element):
    # Joined table inheritance: Element.
    __tablename__ = 'box'
    id = Column(Integer, ForeignKey('element.id'), primary_key=True)
    __mapper_args__ = dict(polymorphic_identity='box')

    # One-to-one relationship: Item.
    item = relationship('Item',
        back_populates='box', uselist=False)

    def __init__(self, item_name=None):
        self.item = Item(item_name)

class Item(Element):
    # Joined table inheritance: Element.
    __tablename__ = 'item'
    id = Column(Integer, ForeignKey('element.id'), primary_key=True)
    __mapper_args__ = dict(polymorphic_identity='item')

    # One-to-one relationship: Box.
    box_id = Column(Integer, ForeignKey('box.id'))
    box = relationship('Box',
        back_populates='item')

    name = Column(String)

    def __init__(self, name):
        self.name = name
当我尝试实例化
b=Box('rock')
时,我得到:

sqlalchemy.exc.AmbiguousForeignKeyError:无法确定relationship Box.item上的父/子表之间的联接条件-有多个外键路径链接这些表。指定'foreign_keys'参数,提供应计为包含对父表的外键引用的列的列表。

现在我去了SQLAlchemy(我可能会加上很棒的文档),但我不确定如何弥合他们的例子和我的情况之间的差距。我想这可能会解决它:

class Item(Element):
    # ...
    box = relationship('Box',
        back_populates='item', foreign_keys=[id, box_id])
    # ...
…但我也犯了同样的错误

我做错了什么


更新: 我现在尝试使用构造来更明确地描述SQLAlchemy所需的行为;无济于事:

class Box(Element):
    # ...
    id = Column(Integer, primary_key=True)
    # ...

    ForeignKeyConstraint([id], ['element.id'])

    # ...

class Item(Element):
    # ...
    id = Column(Integer, primary_key=True)
    # ...

    # One-to-one relationship: Box.
    box_id = Column(Integer)
    box = relationship('Box',
        back_populates='item')

    ForeignKeyConstraint([id, box_id], ['element.id', 'box.id'])

    # ...

一个简单的
AssertionError
向我抛出(没有描述)。鉴于SQLAlchemy在生成有意义的错误消息方面有着良好的记录,这是否表明这是一种意外情况?

应该在
\uuuuu table\u args\uuuuu>中传递一个显式的
ForeignKeyConstraint
,而不是仅仅在类体中构造它。@IljaEverilä这就是惯例吗?如果
继承自
而不是
元素
,则在
的类主体中具有
ForeignKeyConstraint
可以正常工作。(我使用的是v1.3.0)不是这样,尽管SQLA可能通过使用实际的
id
列来建立连接,而不是将其名称作为字符串传递。至少在
Index
中可以做到这一点。相关文档:@IljaEverilä您认为SQLA通过列实例建立连接是正确的。如果我将
框的第一个列表的内容
ForeignKeyConstraint
放在引号中,我会得到一个
NoForeignKeyError
。同样,对于
。应该在
\uuu table\u args\uuuu
中传递一个显式的
ForeignKeyConstraint
,而不只是在类体中构造它。@IljaEverilä这就是约定吗?如果
继承自
而不是
元素
,则在
的类主体中具有
ForeignKeyConstraint
可以正常工作。(我使用的是v1.3.0)不是这样,尽管SQLA可能通过使用实际的
id
列来建立连接,而不是将其名称作为字符串传递。至少在
Index
中可以做到这一点。相关文档:@IljaEverilä您认为SQLA通过列实例建立连接是正确的。如果我将
框的第一个列表的内容
ForeignKeyConstraint
放在引号中,我会得到一个
NoForeignKeyError
。对于
也是如此。