Python SqlAlchemy-外来表中的多态鉴别器
我正在SqlAlchemy中使用Python SqlAlchemy-外来表中的多态鉴别器,python,inheritance,sqlalchemy,Python,Inheritance,Sqlalchemy,我正在SqlAlchemy中使用联接表继承构造一组表,其中包含所有不同类型的子类表作为字符串 父表将与此ParentTypes表具有一对多关系。我不知道如何(或者如果可能的话)将ParentType表中的字符串列指定为SqlAlchemy中的“鉴别器” 下面是一个简单的三表模式,其中子项继承父项。我希望“child”成为多态身份。我知道一种解决方法是只将父项中的polymorphic_on字段设置为parentTypeId,但我希望避免使用这些标识符,因为它们可能在部署之间发生变化 from s
联接表继承
构造一组表,其中包含所有不同类型的子类表作为字符串
父表将与此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
shadowssqlalchemy.join
。只是在测试时弹出的东西。@IljaEveriläYeah,最终将鉴别器设置为id,并在初始化期间确定哪个id是哪个id。是的,很抱歉,star imports只是一个例子-我通常做一个import sqalchemy as sa
,并使用sa引用导入的方法。如果你想添加使用基于整数的鉴别器作为答案的建议,我将把它标记为已解决。请您考虑一下“核心表定义”。你在这里的确切意思是什么?如果我理解正确,你是在建议polymorphic\u on
仅在类型表预先存在的情况下,才使用ForeignKey
参数处理列。parentTypesTable=table(…)
等是“核心”表定义,在这种情况下,可用于在映射模型之前进行示例查询。如果知道鉴别器值,您可以提前创建映射,包括polymorphic_on
和polymorphic_identity
定义,但如果外键约束失败,您将无法插入新行,并且您无法使用该约束创建引用表,如果引用的表不存在。