我正在使用SQLAlchemy的联接表继承模式,但是使用精确的模式in their docs,我无法弄清楚如何将子类应用于父类的现有实例。
在他们的示例中:
class Employee(Base):
__tablename__ = 'employee'
id = Column(Integer, primary_key=True)
name = Column(String(50))
type = Column(String(50))
__mapper_args__ = {
'polymorphic_identity':'employee',
'polymorphic_on':type
}
class Engineer(Employee):
__tablename__ = 'engineer'
id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
engineer_name = Column(String(30))
__mapper_args__ = {
'polymorphic_identity':'engineer',
}
class Manager(Employee):
__tablename__ = 'manager'
id = Column(Integer, ForeignKey('employee.id'), primary_key=True)
manager_name = Column(String(30))
__mapper_args__ = {
'polymorphic_identity':'manager',
}
...想象我已经有一个既不是工程师也不是经理的员工,但是后来他们被提拔了。做这样的事情...
employee = Employee.query.get(id)
m = Manager()
m.employee = employee
m = session.merge(employee)
...导致此错误...
FlushError: New instance <Manager at 0x7f6bf5a35490> with identity key (<class 'models.Employee'>, conflicts with persistent instance <Employee at 0x7f6bf590d210>
那么,我将如何晋升某人?
python大神给出的解决方案
使用单独的表(在SQLAlchemy中映射到不同的类)完全代表同一实体以不同的角色处于非常可疑和完全相反的模式之间-正是由于您遇到的问题:实体的角色可以更改(在这里,通过提升),但是更改表示同一实体的SQL表/ SQLAlchemy类正好遇到了您刚遇到的问题。
我建议您更改数据模型-例如,向所有员工添加字段以确定他们是否是经理,并完全丢失Manager
表。如果您坚决要保留此数据模型,那么促销将变得相当繁琐……:
复制正在升级的员工身份的所有数据
从数据库中删除所述实体
直到现在,创建管理器实体,将您保存的sub(1)数据复制到其中,并将其保存到数据库中
我无法想象这些复杂性值得现在继续使用。