需要 SqlAlchemy 单 table 继承的经典映射器示例
Need classic mapper example for SqlAlchemy single table inheritance
我找到了如何使用 Class 映射进行单一 table 继承的示例。
http://docs.sqlalchemy.org/en/latest/orm/inheritance.html#single-table-inheritance
但对于我来说,我找不到一个示例来说明如何使用经典映射器执行此操作,以便我可以将 类 和持久映射分开。
如何将此示例转换为经典映射?我很清楚如何创建 tables,只是不确定如何实际构造映射器。
示例中,定义了以下类型:
class Employee(Base):
class Manager(Employee):
class Engineer(Employee):
假设我已经创建了合适的 table:
employee = Table(...Column(type...))
我如何为映射器编写代码,以便经理和工程师都生活在同一个 table(单一 table 继承)中,按类型区分("manager"、"engineer" 或其他员工)?
谢谢。
手动映射 class 继承层次结构很费力,我不推荐这样做,但可以这样做。首先定义您的 table。由于使用单个 table 继承,它必须包括所有必需的列:
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))
)
平原Pythonclasses:
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
以及class逻辑映射:
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'})
请注意您必须如何在每个映射器中手动限制映射的属性,这将很难在较大的层次结构中进行维护。使用声明式时,一切都为您处理。
我找到了如何使用 Class 映射进行单一 table 继承的示例。
http://docs.sqlalchemy.org/en/latest/orm/inheritance.html#single-table-inheritance
但对于我来说,我找不到一个示例来说明如何使用经典映射器执行此操作,以便我可以将 类 和持久映射分开。
如何将此示例转换为经典映射?我很清楚如何创建 tables,只是不确定如何实际构造映射器。
示例中,定义了以下类型:
class Employee(Base):
class Manager(Employee):
class Engineer(Employee):
假设我已经创建了合适的 table:
employee = Table(...Column(type...))
我如何为映射器编写代码,以便经理和工程师都生活在同一个 table(单一 table 继承)中,按类型区分("manager"、"engineer" 或其他员工)?
谢谢。
手动映射 class 继承层次结构很费力,我不推荐这样做,但可以这样做。首先定义您的 table。由于使用单个 table 继承,它必须包括所有必需的列:
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))
)
平原Pythonclasses:
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
以及class逻辑映射:
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'})
请注意您必须如何在每个映射器中手动限制映射的属性,这将很难在较大的层次结构中进行维护。使用声明式时,一切都为您处理。