bogatyrevata / klasstrueda

0 stars 0 forks source link

Исправить ошибку при удалении мастера #116

Closed bogatyrevata closed 3 weeks ago

bogatyrevata commented 1 month ago

sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1048, "Column 'artist_id' cannot be null") [SQL: UPDATE artistwork SET artist_id=%(artist_id)s WHERE artistwork.id = %(artistwork_id)s] [parameters: [{'artist_id': None, 'artistwork_id': 2}, {'artist_id': None, 'artistwork_id': 3}]] (Background on this error at: https://sqlalche.me/e/20/gkpj)

Ошибка sqlalchemy.exc.IntegrityError: (pymysql.err.IntegrityError) (1048, "Column 'artist_id' cannot be null") возникает, потому что при удалении мастера (Artist) связанная запись в таблице artistwork требует наличие значения в поле artist_id. Однако, удаляя запись мастера, вы оставляете связанные с ним записи ArtistWork без ссылки на artist_id, что вызывает ошибку целостности данных.

Для решения этой проблемы вам нужно либо:

Удалить все связанные записи ArtistWork перед удалением мастера. Обновить связи так, чтобы artist_id в ArtistWork был NULL, если мастер удаляется.

bogatyrevata commented 1 month ago

Либо удалить все работы мастера вместе с его удалением

bogatyrevata commented 1 month ago

def delete_artist(artist_id):
    artist_db = Artist.query.get_or_404(artist_id)

    if artist_db:
        # Удаление всех связанных ArtistWork перед удалением мастера
        artist_db.works.delete()

        db.session.delete(artist_db)
        db.session.commit()
        flash("Мастер и его работы успешно удалены!", "success")
    else:
        flash("Ошибка при удалении мастера!", "danger")

    return redirect(url_for(".index"))```
bogatyrevata commented 1 month ago

Либо при удалении мастера в работах мастера будет NULL

bogatyrevata commented 1 month ago

artist_id = db.Column(db.Integer, db.ForeignKey("artist.id", ondelete="SET NULL"))

# В вашем маршруте для удаления
@admin_courses.route("/delete-artist/<int:artist_id>", methods=["GET"])
def delete_artist(artist_id):
    artist_db = Artist.query.get_or_404(artist_id)

    if artist_db:
        db.session.delete(artist_db)
        db.session.commit()
        flash("Мастер успешно удален, а связи обновлены на NULL!", "success")
    else:
        flash("Ошибка при удалении мастера!", "danger")

    return redirect(url_for(".index"))```