gpt4 book ai didi

python - 现有实例上的 SQLAlchemy 类继承

转载 作者:行者123 更新时间:2023-11-28 21:51:52 28 4
gpt4 key购买 nike

我正在使用 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>

那么,我该如何提拔某人?

最佳答案

使用单独的表(在 SQLAlchemy 中映射到不同的类)来完全代表不同角色中的同一实体是介于非常可疑和完全反模式之间的某个地方——正是因为你的问题再次遇到:一个实体的角色可以改变(在这里,通过提升),但是改变代表同一实体的 SQL 表/SQLAlchemy 类恰恰会遇到你刚刚遇到的那种问题。

我会建议更改您的数据模型——例如,向所有员工添加一个字段以确定他们是否是经理,并完全丢失 Manager 表。如果您坚持要保留此数据模型,那么晋升就会变得相当费力......:

  1. 复制内存中正在晋升的员工身份的所有数据

  2. 从数据库中删除所述实体

  3. 只是现在,创建管理器实体,将您保存的数据复制到其中 sub(1),并将其保存到数据库中

我无法想象让现在使用的架构值得这些复杂的事情......

关于python - 现有实例上的 SQLAlchemy 类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29184460/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com