Как удалить запись из базы данных в flask-SQLAlchemy?

#python #database #sqlite #sqlalchemy #flask-sqlalchemy

Вопрос:

Как удалить запись из базы данных, хранящейся в Flask SQLAlchemy? Я сделал это так, и он все еще показывает такую ошибку :

sqlalchemy.exc.InvalidRequestError: Instance '<users at 0x1d6436a3be0>' is not persisted

Это имя базы данных:

 db = SQLAlchemy(app)

class users(db.Model):
    _id = db.Column("id", db.Integer, primary_key=True)
    name = db.Column("name", db.String(100))
    email = db.Column("email", db.String(100))


    def __init__(self, name, email):
        self.name = name
        self.email = email
 

Это метод, который я использовал:

 @app.route("/view", methods=["POST", "GET"])
def view():

    if "user" in session:
        user = session["user"]
        
        if request.method == "POST":
            user = request.form["nm"]
            session["user"] = user

            found_user = users.query.filter_by(name=user).first()
            email = found_user.email

            if found_user:
                usr = users(user, email)
                db.session.delete(usr)
                db.session.commit()
                flash("An Account has been Deleted!")
            else :
                flash("Name is not found")

        else:
            return render_template("view.html", values=users.query.all())

    else:
        flash("Please Login First")
        return redirect(url_for("login"))
 

Комментарии:

1. можете ли вы добавить ошибку в свой вопрос?

2. Мне жаль, что я забыл добавить его, теперь он уже добавлен

Ответ №1:

Вы пытаетесь удалить новый экземпляр пользователя. Который вы создали с помощью

 usr = users(user, email)
 

Поскольку пользователь, электронная почта не является первичным ключом, это другой экземпляр пользователя, чем пользователь, которого вы пытаетесь удалить. Вы должны удалить found_user.
напр.:

 if found_user:
    db.session.delete(found_user)
    db.session.commit()
    flash("An Account has been Deleted!")
 

Комментарии:

1. Большое вам спасибо, это сработало found_user , сначала я подумал, что он использует usr вместо found_user

2. @HansViz, если можно, я внесу предложение. Поскольку вы выбираете пользователей по их имени пользователя, возможно, вам захочется сделать этот столбец уникальным в спецификации табличной модели.