Python SqlAlchemy-外来表中的多态鉴别器

Python SqlAlchemy-外来表中的多态鉴别器,python,inheritance,sqlalchemy,Python,Inheritance,Sqlalchemy,我正在SqlAlchemy中使用联接表继承构造一组表,其中包含所有不同类型的子类表作为字符串 父表将与此ParentTypes表具有一对多关系。我不知道如何(或者如果可能的话)将ParentType表中的字符串列指定为SqlAlchemy中的“鉴别器” 下面是一个简单的三表模式,其中子项继承父项。我希望“child”成为多态身份。我知道一种解决方法是只将父项中的polymorphic_on字段设置为parentTypeId,但我希望避免使用这些标识符,因为它们可能在部署之间发生变化 from s

我正在SqlAlchemy中使用
联接表继承
构造一组表,其中包含所有不同类型的子类表作为字符串

父表将与此
ParentTypes
表具有一对多关系。我不知道如何(或者如果可能的话)将
ParentType
表中的字符串列指定为SqlAlchemy中的“鉴别器”

下面是一个简单的三表模式,其中
子项
继承
父项
。我希望“child”成为多态身份。我知道一种解决方法是只将
父项
中的
polymorphic_on
字段设置为
parentTypeId
,但我希望避免使用这些标识符,因为它们可能在部署之间发生变化

from sqlalchemy import *
from sqlalchemy.orm import *
metadata = MetaData()

parentTypesTable = Table(
    'ParentTypes', metadata,
    Column('parentTypeId', Integer, primary_key=True),
    Column('name', String, unique=True)
)

parentsTable = Table(
    'Parents', metadata,
    Column('parentId', Integer, primary_key=True),
    Column('parentTypeId', Integer, ForeignKey('ParentTypes.parentTypeId'))
)

childrenTable = Table(
    'Children', metadata,
    Column('parentId', Integer, ForeignKey('Parents.parentId'), primary_key=True)
)

class ParentType(object): pass
class Parent(object): pass
class Child(Parent): pass

mapper(ParentType, parentTypesTable)
mapper(Parent, parentsTable,
    polymorphic_on= # How might I access ParentType's name column?
)
mapper(Child, childrenTable, inherits=Parent, polymorphic_identity="child")

在这种情况下,由于表和数据预先存在,一个简单的解决方案是加载与文本鉴别器匹配的整数值,并将其与

polymorphic_on=parentsTable.c.parentTypeId
可以使用核心
定义在构建映射器之前加载值,之后设置
多态性标识=
参数是一个简单的查找问题


如果您的模式稍有不同,您也可以尝试,但由于鉴别器值与每个对象的其他数据一起分别插入,并且您的
ParentTypes.name
是唯一的,您不能使用该解决方案。

问题在于,据我所知,SQLAlchemy试图为每个实体插入鉴别器和其他数据,但名称在您的模型中是唯一的。如果不是这样,您可以映射到连接。如果您正在映射现有的表和数据,那么您可以在构建映射器之前加载
ParentTypes
的内容,并在此基础上分配鉴别器。顺便说一句:星形导入可能是有害的,例如在本例中。例如
sqlalchemy.orm.join
shadows
sqlalchemy.join
。只是在测试时弹出的东西。@IljaEveriläYeah,最终将鉴别器设置为id,并在初始化期间确定哪个id是哪个id。是的,很抱歉,star imports只是一个例子-我通常做一个
import sqalchemy as sa
,并使用
sa引用导入的方法。如果你想添加使用基于整数的鉴别器作为答案的建议,我将把它标记为已解决。请您考虑一下“核心表定义”。你在这里的确切意思是什么?如果我理解正确,你是在建议
polymorphic\u on
仅在类型表预先存在的情况下,才使用
ForeignKey
参数处理
列。
parentTypesTable=table(…)
等是“核心”表定义,在这种情况下,可用于在映射模型之前进行示例查询。如果知道鉴别器值,您可以提前创建映射,包括
polymorphic_on
polymorphic_identity
定义,但如果外键约束失败,您将无法插入新行,并且您无法使用该约束创建引用表,如果引用的表不存在。