Matix who codes Ответов: 1

Flask sqlalchemy возвращает integretyerror, когда я пытаюсь удалить строку.


Здравствуйте, у меня есть небольшое веб-приложение, использующее flask и sqlAlchemy.

В настоящее время я застрял на одной проблеме. Проблема в том, что я не могу удалить записи из базы данных с помощью sqlAlchemy. Ошибка, которая возвращается:
sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL constraint failed: attachment.share_id
[SQL: UPDATE attachment SET share_id=? WHERE attachment."ID" = ?]
[parameters: (None, 1)]
(Background on this error at: http://sqlalche.me/e/gkpj)


Как выглядят мои коды (модуль sql):
class Share(db.Model):
    ID = db.Column(db.Integer, primary_key=True)
    id = db.synonym("ID")
    uuid = db.Column(db.String(36), unique=True,
                     nullable=False, default=get_unique_id)
    title = db.Column(db.String(100), nullable=True)
    content = db.Column(db.Text, nullable=False)
    date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
    user_id = db.Column(db.Integer, db.ForeignKey('user.ID'), nullable=False)
    attachments = db.relationship(
        "Attachment", backref="share", lazy=True)
    comments = db.relationship(
        "Comment", backref="share", order_by="desc(webapp.models.Comment.date)", lazy=True)

    def __repr__(self):
        return f"<Share('{self.ID}', '{self.title}', '{self.date}')>"


Код, в котором я пытаюсь удалить запись:
@app.route("/community/share/<share_uuid>/delete")
@login_required
def delete_share(share_uuid):
    share = Share.query.filter_by(uuid=share_uuid).first()
    if share and share.author == current_user:
        pass
    else:
        abort(403)

    if request.args.get("confirm") == "yes":
        db.session.delete(share)
        db.session.commit()

        flash("Share successfully deleted.", "flash")
        return redirect(url_for('community'))

    return render_template("community/share/delete.html", share=share, title="Delete Share?")


Что я уже пробовал:

Я понятия не имею, с чего начать, поэтому, пожалуйста, пришлите мне немного помощи...

1 Ответов

Рейтинг:
1

MadMyche

Проблема, с которой вы столкнулись, похоже, вызвана наличием связи между двумя задействованными таблицами (share / attachment) и попыткой удалить запись из таблицы с помощью PrimaryKey.

Ошибки DBAPI

IntegrityError
Исключение возникает, когда нарушается реляционная целостность базы данных, например ошибка проверки внешнего ключа.
Эта ошибка является ошибкой DBAPI и происходит от драйвера базы данных (DBAPI)...

Что бы я сделал, так это удалил затронутые строки из списка. Attachment таблица перед выполнением удаления в Share стол.