【发布时间】:2017-04-08 05:56:29
【问题描述】:
我一直在尝试使用 Flask 和 Flask-Sqlalchemy 更新我的 Sqlite 数据库中随机选择的行。我在数据库中只有几行名为“word”、“yes”和“no”的列,其中 word 是一个字符串,yes 和 no 是整数。 “投票”视图上有两个按钮,是和否。当按下按钮时,相应的代码会执行,应该增加 yes 或 no 列,并使用 Word 表中的新随机词更新视图。
@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
保存在会话对象中,但仅在下次查询该数据库行时才提交。当我将方法顶部的查询替换为:
row = Word.query.get(4)
返回 id 为 4 的行。使用此查询,yes 或 no 列会立即更新。
有什么想法吗?
谢谢
【问题讨论】:
-
您的增量容易受到竞争条件的影响。您应该让数据库为您处理增量。
row.yes = Word.yes + 1
标签: sqlite python-3.x flask sqlalchemy flask-sqlalchemy