我一直在嘗試使用Flask和Flask-Sqlalchemy來更新我的Sqlite數據庫中隨機選擇的一行。我在數據庫中只有幾行,名爲「word」,「yes」和「no」,其中word是一個字符串,yes和no是整數。 「投票」視圖上有兩個按鈕,是和否。當按下按鈕時,執行相應的代碼,應增加「是」或「否」列,並使用Word表中新的隨機單詞更新視圖。使用Flask-Sqlalchemy更新數據庫中的隨機行
@app.route("/vote", methods=["GET", "POST"])
def vote():
#Get random row from database
query = db.session.query(Word)
rowCount = int(query.count())
row = query.offset(int(rowCount*random.random())).first()
#POST
# If "yes" button is pressed, increment yes column in database
if request.method == "POST":
if request.form.get("yes"):
row.yes += 1
db.session.commit()
return render_template("vote.html", row=row)
# otherwise increment no column
elif request.form.get("no"):
row.no += 1
db.session.commit()
return redirect(url_for("vote"))
#GET
# on get request, render vote.html
return render_template("vote.html", row=row)
此代碼正在工作,但yes和no列僅在視圖下次回到隨機單詞時更新。如果我點擊一個按鈕後立即關閉瀏覽器,數據庫不會增加。我認爲這與db.session.commit()有關,或者與會話有關。這似乎是:
row.yes += 1
被保存在session對象,但只是承諾當數據庫行查詢的下一次。此代碼沒有工作時,我更換了查詢在方法的頂部:
row = Word.query.get(4)
返回與4號列與該查詢中,是或否柱立即更新。
有什麼想法?
感謝
您的增量容易受到競爭條件的影響。你應該讓數據庫爲你處理增量。 'row.yes = Word.yes + 1' – dirn