需要 SqlAlchemy 单表继承的经典映射器示例

Ale*_*sky 3 python inheritance sqlalchemy single-table-inheritance mapper

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

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

但是对于我的生活,我找不到如何使用经典映射器执行此操作的示例,以便我可以将我的类和持久映射分开。

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

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

class Employee(Base):

class Manager(Employee):

class Engineer(Employee):
Run Code Online (Sandbox Code Playgroud)

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

employee = Table(...Column(type...))
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

Ilj*_*ilä 7

手动映射类继承层次结构很费力,不是我推荐的,但这里是。首先定义您的表。由于使用单表继承,它必须包含所有必需的列:

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))
)
Run Code Online (Sandbox Code Playgroud)

普通的 Python 类:

class Employee:

    def __init__(self, name):
        self.name = name

class Manager(Employee):

    def __init__(self, name, manager_data):
        super().__init__(name)
        self.manager_data = manager_data

class Engineer(Employee):

    def __init__(self, name, engineer_info):
        super().__init__(name)
        self.engineer_info = engineer_info
Run Code Online (Sandbox Code Playgroud)

和经典映射:

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'})
Run Code Online (Sandbox Code Playgroud)

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