需要SqlAlchemy single table inheritan的经典映射器示例

2024-05-19 19:48:32 发布

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

我发现了一个如何使用类映射进行单表继承的示例。在

http://docs.sqlalchemy.org/en/latest/orm/inheritance.html#single-table-inheritance

但是在我的一生中,我找不到一个例子来说明如何使用经典的mapper来实现这一点,这样我就可以将类和持久映射分开。在

如何将此示例转换为经典映射?我很清楚如何创建表,只是不知道如何实际构造映射器。在

在本例中,定义了以下类型:

class Employee(Base):

class Manager(Employee):

class Engineer(Employee):

假设我已经创建了适当的表:

^{pr2}$

如何为映射器编写代码,以便管理器和工程师都住在同一个表中(单表继承),并按类型(“经理”、“工程师”或其他雇员)区分?在

谢谢。在


Tags: orghttp示例docssqlalchemyhtmlormemployee
1条回答
网友
1楼 · 发布于 2024-05-19 19:48:32

手动映射类继承层次结构很费劲,我不建议这样做,但这里是这样。从定义表开始。由于使用单表继承,它必须包括所有必需的列:

metadata = MetaData()

employee = Table(
    'employee',
    metadata,
    Column('id', Integer, primary_key=True),
    Column('name', String(50)),
    Column('type', String(20)),
    Column('manager_data', String(50)),
    Column('engineer_info', String(50))
)

纯Python类:

^{pr2}$

以及经典映射:

mapper(Employee, employee,
       polymorphic_on=employee.c.type,
       polymorphic_identity='employee',
       exclude_properties={'engineer_info', 'manager_data'})


mapper(Manager,
       inherits=Employee,
       polymorphic_identity='manager',
       exclude_properties={'engineer_info'})


mapper(Engineer,
       inherits=Employee,
       polymorphic_identity='engineer',
       exclude_properties={'manager_data'})

请注意,您必须如何在每个映射器中手动限制映射的属性,这将很难在较大的层次结构中进行维护。当使用声明式时,所有这些都是为您处理的。在

相关问题 更多 >