Python sqlalchemy中的多态自指外键

Python sqlalchemy中的多态自指外键,python,sql,sqlalchemy,foreign-keys,Python,Sql,Sqlalchemy,Foreign Keys,我试图解决具有联接表继承的自引用表的一个问题,其中有一个外键链接继承关系,但也有一个类对其父类实例具有附加引用的情况。最好使用一个简化的示例: 类B从类A继承。类B通过类B中的外键通过id列链接到类A。类B还有一个列(A_id),该列引用与继承无关的类A 从sqlalchemy导入列,整数,外键,创建引擎 从sqlalchemy.ext.declarative导入声明性基础 从sqlalchemy.orm导入会话生成器、关系、backref Base=声明性_Base() A类(基本类): __

我试图解决具有联接表继承的自引用表的一个问题,其中有一个外键链接继承关系,但也有一个类对其父类实例具有附加引用的情况。最好使用一个简化的示例:

类B从类A继承。类B通过类B中的外键通过id列链接到类A。类B还有一个列(
A_id
),该列引用与继承无关的类A

从sqlalchemy导入列,整数,外键,创建引擎
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy.orm导入会话生成器、关系、backref
Base=声明性_Base()
A类(基本类):
__tablename_uuu='a'
satype=列(字符串(50))
__映射器参数={
“多态性身份”:“a”,
“多态性”:satype
}
id=列(整数,主键=True)
B(A)类:
__tablename_uuu='b'
id=列(整数,外键('a.id'),主键=True)
__映射器参数={
“多态性_身份”:“b”
}
a_id=列(整数,ForeignKey('a.id'))
a=关系('a',backref='b')
engine=create_engine('sqlite://:memory:',echo=True)
Base.metadata.create_all(引擎)
会话=会话生成器(绑定=引擎)
会话=会话()
根据,我将通过在要使用的关系中显式指定来解决表之间存在多个foreignkey的情况

B(A)类:
__tablename_uuu='b'
id=列(整数,外键('a.id'),主键=True)
__映射器参数={
“多态性_身份”:“b”
}
a_id=列(整数,ForeignKey('a.id'))
#我知道SA>=0.8不再需要primaryjoin
a=关系('a',backref='b',外键=[a\u id],primaryjoin=a\u id==a.id)

我认为问题在于我似乎无法找出如何对多态列
id
执行相同的操作,因为我没有明确定义这种关系。

感谢SA谷歌小组中的Michael Bayer给出了这个答案:

“相互依赖的外键”文档实际上不适用于 这个案子。这里发生的是B(A)需要从B到的连接 A、 B.A需要一个不同的。即使公约 这里明确了哪个外键约束是哪个,映射器 仍然需要明确地说明,如下所示:

B(A)类:
__tablename_uuu='b'
id=列(整数,外键('a.id'),主键=True)
__映射器参数={
“多态性_身份”:“b”,
“继承条件”:id==A.id
}
a_id=列(整数,ForeignKey('a.id'))
a=关系(
“A”,
backref='b',primaryjoin=A.id==A\u-id,remote\u-side=A.id)

我正面临着这个问题。感谢您发布Mike的回复!