首页 > 解决方案 > 删除级联总是导致与外键约束冲突

问题描述

我目前有两个不同的表来存储不同类型的模型(为了这个问题,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足以实现这种行为,这就是为什么我无法弄清楚为什么会发生这种情况。

如果您能帮助我理解为什么会发生这种情况,以及如何正确配置事物以便获得所需的行为,那就太好了。提前致谢 :)

标签: pythonpostgresqlsqlalchemyforeign-keyscascade

解决方案


推荐阅读