python - 删除级联总是导致与外键约束冲突
问题描述
我目前有两个不同的表来存储不同类型的模型(为了这个问题,Task
我称之为它们)。Computer
创建新任务时,会为其分配一台计算机(将用于计算任务)。任务完成后,计算机可再次用于其他任务,任务标记为完成。
Task
模型定义如下所示:
class Task():
__tablename__ = "task"
id = Column(String(32), primary_key=True, default=lambda: uuid4().hex)
creation_timestamp = Column(DateTime, default=datetime.utcnow)
computer_id = Column(Integer, ForeignKey(Computer.id))
computer: Computer = relationship(Computer, cascade="all, delete-orphan", single_parent=True)
Computer
模型定义如下所示:
class Computer():
__tablename__ = "computer"
id = Column(Integer, primary_key=True)
name = Column(Unicode(32))
问题是任务完成后,当尝试删除用于该任务的计算机时,我收到以下错误:
sqlalchemy.exc.IntegrityError: (psycopg2.errors.ForeignKeyViolation) update or delete on table "computer" violates foreign key constraint "task_computer_id_fkey" on table "task"
DETAIL: Key (id)=(100) is still referenced from table "task".
2019-09-23T14:31:19.358364700Z
[SQL: DELETE FROM computer WHERE computer.id = %(id_1)s]
[parameters: {'id_1': '100'}]
(Background on this error at: http://sqlalche.me/e/gkpj)
我想要发生的是,当计算机被删除时,所有以前使用它的任务也将被删除。从文档来看,级联似乎all, delete-orphan
足以实现这种行为,这就是为什么我无法弄清楚为什么会发生这种情况。
如果您能帮助我理解为什么会发生这种情况,以及如何正确配置事物以便获得所需的行为,那就太好了。提前致谢 :)
解决方案
推荐阅读
- windows - 如何在Windows中删除系统路径变量
- ios - 以编程方式为所有 iPhone 和 iPad 设备的横向和纵向模式下的 UIButtons 设置角半径
- c++ - 从 C++ 中的函数退出
- swift - Swift 中属性观察者的性能和资源成本是多少?
- python - 如何修复涉及保存后信号的 createsuper 错误
- go - 如何覆盖重载变量
- c# - 读取 7-zip 而不解压到文件
- sql - SQL 查询与 UNION 条件的比较
- jupyter-notebook - PyTorch 正在使 jupyter 笔记本崩溃,同时使用 nn 模块计算损失?
- sql - 如何在选择多列时按 1 列分组