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 *。我嘗試瞭解你如何最好地手動模擬,但還沒有找到方法。所以也許這個答案在未來可能會有所改進。即使如此,您仍然必須跟蹤要排除的內容以及在更大的層次結構中添加到表中的內容。 –