手動映射類繼承層次結構是費力的,而不是我推薦的,但是在這裏。首先定義你的表格。由於採用單表繼承,它必須包含所有必需的列:你怎麼也得
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 *。我嘗試瞭解你如何最好地手動模擬,但還沒有找到方法。所以也許這個答案在未來可能會有所改進。即使如此,您仍然必須跟蹤要排除的內容以及在更大的層次結構中添加到表中的內容。 –