手动映射类继承层次结构是费力的,而不是我推荐的,但是在这里。首先定义你的表格。由于采用单表继承,它必须包含所有必需的列:你怎么也得
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
和经典映射在每个映射器中手动限制映射的属性,这将变得很难维护更大的层次结构。当使用声明时,所有为您处理的。
您的注意事项很好。将这个例子应用到我自己的类后,我看到这个过程变得多么辛苦。 –
声明似乎处理创建表和映射器对单个表继承有点不同,并似乎可以添加子类时增量定义表。在docs中的示例中,唯一使用'exclude_properties'的是'Engineer',不包括* manager_data *。我尝试了解你如何最好地手动模拟,但还没有找到方法。所以也许这个答案在未来可能会有所改进。即使如此,您仍然必须跟踪要排除的内容以及在更大的层次结构中添加到表中的内容。 –