Sqlite 使用Flask Sqlalchemy更新数据库中的随机行
我一直在尝试使用Flask和Flask Sqlalchemy更新Sqlite数据库中随机选择的一行。我在数据库中只有几行,列名为“word”、“yes”和“no”,其中word是字符串,yes和no是整数。“投票”视图上有两个按钮,是和否。按下按钮时,执行相应的代码,应增加“是”或“否”列,并使用单词表中的新随机单词更新视图Sqlite 使用Flask Sqlalchemy更新数据库中的随机行,sqlite,python-3.x,flask,sqlalchemy,flask-sqlalchemy,Sqlite,Python 3.x,Flask,Sqlalchemy,Flask Sqlalchemy,我一直在尝试使用Flask和Flask Sqlalchemy更新Sqlite数据库中随机选择的一行。我在数据库中只有几行,列名为“word”、“yes”和“no”,其中word是字符串,yes和no是整数。“投票”视图上有两个按钮,是和否。按下按钮时,执行相应的代码,应增加“是”或“否”列,并使用单词表中的新随机单词更新视图 @app.route("/vote", methods=["GET", "POST"]) def vote(): #Get random row from data
@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的行。通过此查询,会立即更新“是”或“否”列
有什么想法吗
谢谢我认为您需要在提交之前将更新添加到会话中,使用如下代码:
[...]
row.yes += 1
db.session.add(row)
db.session.commit()
[...]
这就是我在炼金术中用于基本更新的模式。谢谢大家。我解决了这个问题。数据库增量实际上工作正常,但我没有增加正确的行。问题是,每次调用vote()方法时,我都从数据库中生成一个随机行,这意味着我为GET请求获取了一个随机值,为POST请求获取了一个不同的随机值,并最终在POST请求中增加了该不同的随机值 我将逻辑分离为“/vote”路由的两个方法,getWord()和vote(),并为行生成创建了一个randRow()方法。我需要存储调用getWord()时生成的随机行,因此我使用了会话变量,以便可以从vote()方法访问随机行。这有点冗长,但似乎有效 有人对如何实现这一点有更好的想法吗
@app.route('/vote', methods=["GET"])
def getWord():
wordObj = randRow()
session['word'] = wordObj.word
session['yesVotes'] = wordObj.yes
session['noVotes'] = wordObj.no
return render_template("vote.html", word=session['word'], yesVotes=session['yesVotes'], noVotes=session['noVotes'])
@app.route('/vote', methods=["POST"])
def vote():
# store session 'word' in word variable
# look up word in database and store object in wordObj
word = session['word']
wordObj = Word.query.filter_by(word=word).first()
# check button press on vote view, increment yes or no column
# depending on which button was pressed
if request.form.get("yes"):
wordObj.yes = wordObj.yes + 1
elif request.form.get("no"):
wordObj.no = wordObj.no + 1
db.session.commit()
return redirect(url_for("getWord"))
###### HELPERS ######
# returns a random row from the database
def randRow():
rowId = Word.query.order_by(func.random()).first().id
row = Word.query.get(rowId)
return row
您的增量容易受到比赛条件的影响。您应该让数据库为您处理增量
row.yes=Word.yes+1
如果通过会话加载内容,则无需向会话添加内容<代码>模型。查询可以做到这一点。