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