使用Blask-Sqlalchemy在DB中更新随机行



我一直在尝试使用烧瓶和烧瓶-Sqlalchemy在我的SQLite数据库中随机选择的行。我在数据库中只有几行,其中包含称为" word"," yes"one_answers" no"的列,其中词是字符串,是,否是整数。"投票"视图上有两个按钮,是的,否。按下按钮时,应执行适当的代码,应递增是或否列,并使用单词表中的新随机单词更新视图。

@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 and否才会更新。如果我在单击按钮后立即关闭浏览器,则数据库不会增加。我认为这与DB.Session.commit()或有关会议有关。看起来像:

row.yes += 1

保存在会话对象中,但只有在下次查询该数据库行时才犯下。当我用:

替换方法顶部的查询时,此代码确实有效。
row = Word.query.get(4)

以4的ID返回行。在此查询中,是或否列立即更新。

有什么想法吗?

谢谢

谢谢大家。我解决了这个问题。数据库增加实际上工作正常,但是我没有增加正确的行。问题在于,我在cote()方法的每个调用中从数据库中生成了一个随机行,这意味着我获得了get请求的随机值,以及对邮政请求的随机值,并最终增加了该值邮政请求中的不同随机值。

我将逻辑分为"/fot"路由,getword()和cote()的两种方法,并为行生成创建了randrow()方法。我需要存储在调用getWord()时生成的随机行,因此我使用了会话变量,以便可以从投票()方法访问随机行。有点冗长,但似乎有效。

有人对如何实现这一目标有更好的了解?

@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 += 1
    db.session.add(row)
    db.session.commit()
[...]

这是我用于烧瓶 - 塞勒奇米基本更新的模式。

最新更新