SQLAlchemy没有更新记录

时间:2017-06-21 23:31:58

标签: 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)
    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()之后添加commit()没有任何区别,也没有在提交之前将用户添加到会话(db.session.add(user))。

如何更新记录?

1 个答案:

答案 0 :(得分:2)

请记住,if form.validate_on_submit之前的代码在提交表单时仍然执行 - 并且在该代码中,您将使用数据库中的数据覆盖表单数据。

让我们假装用户已经从'old@foo.com'更改了他们的电子邮件;到&#39; 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数据将被销毁。因此,当您更新时,您只需使用已存储的值进行更新。