Каскад удаления всегда приводит к конфликту с ограничением внешнего ключа - PullRequest
1 голос
/ 23 сентября 2019

В настоящее время у меня есть две разные таблицы для хранения моделей разных типов (для целей этого вопроса я назову их 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 должно быть достаточно для достижения такого поведения, поэтому я не могу понять, почему это происходит.

Было быбыло бы здорово, если бы вы могли помочь мне понять, почему это происходит, и как правильно настроить вещи, чтобы я получил желаемое поведение.Заранее спасибо:)

...