2017-06-21 84 views
0

我沒有收到任何錯誤,它只是沒有更新記錄。我編輯的用戶記錄和保存單個字段(我不能使用populate_obj()因爲我只更新有選擇的幾個領域,但db.session.commit()之後,它仍然沒有更新表。SQLAlchemy沒有更新記錄

@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))之前,將用戶添加到會話。

如何d o我更新了記錄?

回答

1

請記住,在提交表單時仍然執行if form.validate_on_submit之前的代碼 - 並且在該代碼中,您將用數據庫中的數據覆蓋表單數據。

讓我們假裝用戶在提交的表單上將他們的電子郵件從'[email protected]'更改爲'[email protected]' - 這是如果我們拒絕表單就會執行的代碼有效分支:

user = User.query.get_or_404(user_id) 
form = EditUserForm() 
form.username.data = user.username 
# at this point form.email.data would be '[email protected]' but.... 
form.email.data = user.email # we then override it with '[email protected]' 
form.first_name.data = user.first_name 
form.last_name.data = user.last_name 
user.email = form.email.data # read '[email protected]' 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")) 

因此,[email protected]數據在表單甚至被驗證之前被破壞。所以當你更新時,你只需更新已存儲的值。

+0

好吧,這是有道理的。我添加了一個檢查,如果請求方法是GET,並且只在最初填充字段(如果有的話)。然後我只驗證POST方法。似乎現在工作大多都很好。謝謝! – Dan