1

我找到了一个如何使用类映射进行单表继承的示例。需要SqlAlchemy单表继承的经典映射器示例

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

但对我的生活,我无法找到如何做到这一点与经典的映射,这样我可以保持我的班和持续映射分离的例子。

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

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

class Employee(Base): 

class Manager(Employee): 

class Engineer(Employee): 

假设我已经创建相应的表:

employee = Table(...Column(type...)) 

我怎样写代码映射器这样既Manager和工程师生活在同一个表(单表继承)中,按类型区分(“经理”,“工程师”或其他雇员)?

谢谢。

回答

1

手动映射类继承层次结构是费力的,而不是我推荐的,但是在这里。首先定义你的表格。由于采用单表继承,它必须包含所有必需的列:你怎么也得

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'}) 

注:

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类:

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 

和经典映射在每个映射器中手动限制映射的属性,这将变得很难维护更大的层次结构。当使用声明时,所有为您处理的。

+0

您的注意事项很好。将这个例子应用到我自己的类后,我看到这个过程变得多么辛苦。 –

+0

声明似乎处理创建表和映射器对单个表继承有点不同,并似乎可以添加子类时增量定义表。在docs中的示例中,唯一使用'exclude_properties'的是'Engineer',不包括* manager_data *。我尝试了解你如何最好地手动模拟,但还没有找到方法。所以也许这个答案在未来可能会有所改进。即使如此,您仍然必须跟踪要排除的内容以及在更大的层次结构中添加到表中的内容。 –