SqlAlchemy - 多态判别器在外部标签

2024-10-04 09:28:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在SqlAlchemy中使用Joined Table Inheritance和一个ParentTypes表构造一组表,其中包含所有不同类型的子类表作为字符串。在

{many}表与这个表有一个ParentType表中的string列指定为SqlAlchemy中的“discriminator”。在

下面是一个简单的3表模式,其中Child继承{}。我希望“孩子”成为polymorphic_identity。{{cd6}可能只是为了避免在cd6}字段之间使用{cd6}来改变。在

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")

Tags: keychildtruetablecolumnintegerparentmetadata
1条回答
网友
1楼 · 发布于 2024-10-04 09:28:28

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

polymorphic_on=parentsTable.c.parentTypeId

在构造映射器之前加载值可以使用核心Table定义完成,之后设置polymorphic_identity=参数是一个简单的查找问题。在

如果您的模式有点不同,您也可以尝试mapping against a join of 2 tables,但由于鉴别器值与每个对象的其他数据一起单独插入,并且您的ParentTypes.name是唯一的,因此不能使用该解决方案。在

相关问题 更多 >