Python SQLAlchemy不更新记录

Python SQLAlchemy不更新记录,python,flask,sqlalchemy,flask-sqlalchemy,flask-wtforms,Python,Flask,Sqlalchemy,Flask Sqlalchemy,Flask Wtforms,我没有收到任何错误,只是没有更新记录。我正在编辑用户记录并保存无法使用populate_obj的单个字段,因为我只更新了部分字段,但在db.session.commit之后,它仍然不会更新表 @app.route("/user/edit/<int:user_id>", methods=["GET", "POST"]) @login_required def edit_user(user_id): user = User.query.get_or_404(user_id)

我没有收到任何错误,只是没有更新记录。我正在编辑用户记录并保存无法使用populate_obj的单个字段,因为我只更新了部分字段,但在db.session.commit之后,它仍然不会更新表

@app.route("/user/edit/<int:user_id>", methods=["GET", "POST"])
@login_required
def edit_user(user_id):
    user = User.query.get_or_404(user_id)
    form = EditUserForm()
    form.username.data = user.username
    form.email.data = user.email
    form.first_name.data = user.first_name
    form.last_name.data = user.last_name
    if form.validate_on_submit():
        user.email = form.email.data
        user.first_name = form.first_name.data
        user.last_name = form.last_name.data
        db.session.commit()
        flash("Updated user '{}'".format(user.username))
        return redirect(url_for("user"))
    return render_template("user_edit_form.html", form=form, action="Edit", user_id=user_id)
它甚至会重定向更新记录的消息,但sqlachemy不会将任何内容写入mysql数据库

在提交后添加db.session.flush没有任何区别,在提交db.session.adduser之前向会话添加用户也没有区别


如何更新记录?

请记住,提交表单时仍会执行if form.validate\u on\u submit之前的代码,在该代码中,您将使用数据库中的数据覆盖表单数据

让我们假设用户已将其电子邮件从old@foo.com“到”new@foo.com'在提交的表单上-如果我们认为表单有效,则将执行以下代码:

user = User.query.get_or_404(user_id)
form = EditUserForm()
form.username.data = user.username
# at this point form.email.data would be 'new@foo.com' but....
form.email.data = user.email # we then override it with 'old@foo.com'
form.first_name.data = user.first_name
form.last_name.data = user.last_name
user.email = form.email.data # read 'old@foo.com' from the data (since we over-rode it above)
user.first_name = form.first_name.data
user.last_name = form.last_name.data
db.session.commit().
flash("Updated user '{}'".format(user.username))
return redirect(url_for("user"))

那么new@foo.com数据在表单验证之前就被销毁了。因此,当您更新时,您只是使用已存储的值进行更新。

请记住,在提交表单时,if form.validate\u on\u submit之前的代码仍然会执行-在该代码中,您使用数据库中的数据覆盖表单数据

让我们假设用户已将其电子邮件从old@foo.com“到”new@foo.com'在提交的表单上-如果我们认为表单有效,则将执行以下代码:

user = User.query.get_or_404(user_id)
form = EditUserForm()
form.username.data = user.username
# at this point form.email.data would be 'new@foo.com' but....
form.email.data = user.email # we then override it with 'old@foo.com'
form.first_name.data = user.first_name
form.last_name.data = user.last_name
user.email = form.email.data # read 'old@foo.com' from the data (since we over-rode it above)
user.first_name = form.first_name.data
user.last_name = form.last_name.data
db.session.commit().
flash("Updated user '{}'".format(user.username))
return redirect(url_for("user"))

那么new@foo.com数据在表单验证之前就被销毁了。因此,当您更新时,您只是使用已存储的值进行更新。

OK,这很有意义。我添加了一个检查request方法是否为GET,如果是,则只在最初填充字段。然后我只验证POST方法。现在似乎工作得很好。谢谢好吧,这是有道理的。我添加了一个检查request方法是否为GET,如果是,则只在最初填充字段。然后我只验证POST方法。现在似乎工作得很好。谢谢