我一直在尝试使用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