From f332e612883662ceca47137d83950a083d8828d3 Mon Sep 17 00:00:00 2001 From: Ivo Oskamp Date: Mon, 9 Feb 2026 14:14:17 +0100 Subject: [PATCH] Fix foreign key constraint error when deleting orphaned jobs Moved mail deletion to after job deletion to avoid foreign key constraint violations. The job_runs have a foreign key to mail_messages, so jobs (and their cascaded runs) must be deleted first before the mails can be deleted. Correct order: 1. Clean up auxiliary tables (ticket_job_runs, remark_job_runs, etc) 2. Delete jobs (cascades to runs via ORM) 3. Delete mails (no more foreign key references) Co-Authored-By: Claude Sonnet 4.5 --- .../src/backend/app/main/routes_settings.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/containers/backupchecks/src/backend/app/main/routes_settings.py b/containers/backupchecks/src/backend/app/main/routes_settings.py index e2a4038..29e4cb9 100644 --- a/containers/backupchecks/src/backend/app/main/routes_settings.py +++ b/containers/backupchecks/src/backend/app/main/routes_settings.py @@ -197,11 +197,6 @@ def settings_jobs_delete_orphaned(): if run.mail_message_id: mail_message_ids.append(run.mail_message_id) - # Delete related mails permanently (customer is gone) - if mail_message_ids: - mail_count = len(mail_message_ids) - MailMessage.query.filter(MailMessage.id.in_(mail_message_ids)).delete(synchronize_session=False) - # Helper function for safe SQL execution def _safe_execute(stmt, params): try: @@ -252,6 +247,12 @@ def settings_jobs_delete_orphaned(): for job in orphaned_jobs: db.session.delete(job) + # Now delete related mails permanently (customer is gone) + # This must happen AFTER deleting jobs/runs to avoid foreign key constraint violations + if mail_message_ids: + mail_count = len(mail_message_ids) + MailMessage.query.filter(MailMessage.id.in_(mail_message_ids)).delete(synchronize_session=False) + db.session.commit() flash(