SqlAlchemy - 外表

时间:2018-01-09 23:04:54

标签: python inheritance sqlalchemy

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

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

下面是一个简单的3表架构,其中Child继承了Parent。我希望'孩子'成为polymorphic_identity。我知道一种解决方法是将polymorphic_on中的Parent字段设置为parentTypeId,但我希望避免使用这些标识符,因为它们可能会在部署之间发生变化。 / p>

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

1 个答案:

答案 0 :(得分:1)

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

polymorphic_on=parentsTable.c.parentTypeId

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

如果您的架构稍有不同,您也可以尝试mapping against a join of 2 tables,但由于识别器值与每个对象的其他数据分别插入,而您的ParentTypes.name是唯一的,你不能使用那个解决方案。