Python SQLAlchemy:通过一对一关系连接继承
我试图用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',
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
。对于项
也是如此。