From 710aba97e461bef2aaf2778cf7d77787c42cc205 Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Mon, 9 Feb 2026 14:26:53 +0100 Subject: [PATCH] Fix foreign key constraint: delete mail_objects before mails Added deletion of mail_objects before deleting mail_messages to avoid foreign key constraint violation. The mail_objects table has a foreign key to mail_messages. Complete deletion order: 1. Clean up auxiliary tables 2. Unlink mails from jobs 3. Delete mail_objects 4. Delete jobs (cascades to runs) 5. Delete mails Co-Authored-By: Claude Sonnet 4.5 --- .../src/backend/app/main/routes_settings.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/containers/backupchecks/src/backend/app/main/routes_settings.py b/containers/backupchecks/src/backend/app/main/routes_settings.py index bbcd119..9b5fd96 100644 --- a/containers/backupchecks/src/backend/app/main/routes_settings.py +++ b/containers/backupchecks/src/backend/app/main/routes_settings.py @@ -252,6 +252,17 @@ def settings_jobs_delete_orphaned(): {"job_ids": job_ids}, ) + # Delete mail_objects before deleting mails + # mail_objects.mail_message_id references mail_messages.id + if mail_message_ids: + from sqlalchemy import text, bindparam + _safe_execute( + text("DELETE FROM mail_objects WHERE mail_message_id IN :mail_ids").bindparams( + bindparam("mail_ids", expanding=True) + ), + {"mail_ids": mail_message_ids}, + ) + # Delete all orphaned jobs (runs/objects are cascaded via ORM relationships) for job in orphaned_jobs: db.session.delete(job)