From a8be6c8d89d9a0db337e28f000225f8c48cc3788 Mon Sep 17 00:00:00 2001 From: Maciej Pienczyn Date: Tue, 14 Apr 2026 13:52:44 +0200 Subject: [PATCH] fix(classifieds): manual cleanup of related rows before delete SQLAlchemy ORM tries to UPDATE classified_reads.classified_id = NULL before deleting the classifieds row, even though the FK has ON DELETE CASCADE at DB level. The NOT NULL constraint on classified_id then raises IntegrityError. Same pattern as the forum_reply_reads fix from 2026-02. Manually delete reads, interests, questions, attachments before db.delete(classified). Co-Authored-By: Claude Opus 4.6 (1M context) --- blueprints/community/classifieds/routes.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/blueprints/community/classifieds/routes.py b/blueprints/community/classifieds/routes.py index bcd77fd..948515b 100644 --- a/blueprints/community/classifieds/routes.py +++ b/blueprints/community/classifieds/routes.py @@ -409,6 +409,14 @@ def delete(classified_id): if not classified: return jsonify({'success': False, 'error': 'Ogłoszenie nie istnieje'}), 404 + # SQLAlchemy ORM doesn't honor DB-level CASCADE — it tries to UPDATE + # FK to NULL on related rows first, which fails on NOT NULL columns. + # Same pattern as forum reply delete fix. Wipe related rows first. + db.query(ClassifiedRead).filter(ClassifiedRead.classified_id == classified.id).delete(synchronize_session=False) + db.query(ClassifiedInterest).filter(ClassifiedInterest.classified_id == classified.id).delete(synchronize_session=False) + db.query(ClassifiedQuestion).filter(ClassifiedQuestion.classified_id == classified.id).delete(synchronize_session=False) + db.query(ClassifiedAttachment).filter(ClassifiedAttachment.classified_id == classified.id).delete(synchronize_session=False) + db.delete(classified) db.commit()