FlaskとFlask-Sqlalchemyを使用して、Sqliteデータベース内のランダムに選択された行を更新しようとしています。私は "word"、 "yes"、 "no"という列を持つデータベースにほんのいくつかの行を持っています。wordは文字列、yesとnoは整数です。 「投票」ビューには、はいといいえの2つのボタンがあります。ボタンを押すと、適切なコードが実行され、yesまたはnoの列がインクリメントされ、Wordテーブルの新しいランダムな単語でビューが更新されます。Flask-Sqlalchemyを使用してDB内のランダムな行を更新します。
@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)
このコードは動作していますが、ビューは、ランダムな単語次回に周りに戻って来るときイエスとノーの列にのみ更新されます。ボタンをクリックした直後にブラウザを閉じると、データベースはインクリメントされません。私はこれがdb.session.commit()やセッションに関するものと関係があると思います。
row.yes += 1
はセッションオブジェクトに保存されますが、そのデータベース行が次に照会されるときにのみコミットされます。 yesまたはno列が即座に更新され、このクエリでは4のIDを持つ行を返す
row = Word.query.get(4)
:私はメソッドの先頭にクエリを交換したときにこのコードは、仕事をしました。
どのような考えですか?私はフラスコSQLAlchemyの中の基本的な更新のために使用したパターンだ
[...]
row.yes += 1
db.session.add(row)
db.session.commit()
[...]
:
おかげ
あなたの増分は競合状態に脆弱です。データベースがあなたのためにインクリメントを処理するようにする必要があります。 'row.yes = Word.yes + 1' – dirn