質問

表の表に3つの列があります.usernamepasswordno_of_logins

ユーザーがログインしようとすると、のようなクエリを含むエントリのチェックがチェックされます。

user = User.query.filter_by(username=form.username.data).first()
.

パスワードが一致した場合、彼はさらに進みます。私がやりたいことは、ユーザーがログインした回数を数えます。SQLAlchemyで更新クエリを実行する方法はわかりません。

役に立ちましたか?

解決

user.no_of_logins += 1
session.commit()
.

他のヒント

UPDATE を使用してsqlalchemyにはいくつかの方法があります。

1) user.no_of_logins += 1
   session.commit()

2) session.query().\
       filter(User.username == form.username.data).\
       update({"no_of_logins": (User.no_of_logins +1)})
   session.commit()

3) conn = engine.connect()
   stmt = User.update().\
       values(no_of_logins=(User.no_of_logins + 1)).\
       where(User.username == form.username.data)
   conn.execute(stmt)

4) setattr(user, 'no_of_logins', user.no_of_logins+1)
   session.commit()
.

承認された答えのコメントの重要な問題を明確にするための例

私が自分で遊んでいるまで私はそれを理解していなかったので、私も混乱していた他の人がいるだろうと考えました。 id == 6と起動時のno_of_logins == 30を使用しているユーザーに取り組んでいるとします。

# 1 (bad)
user.no_of_logins += 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 2 (bad)
user.no_of_logins = user.no_of_logins + 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 3 (bad)
setattr(user, 'no_of_logins', user.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6

# 4 (ok)
user.no_of_logins = User.no_of_logins + 1
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

# 5 (ok)
setattr(user, 'no_of_logins', User.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
.

インスタンスの代わりにクラスを参照することで、SQLAlchemyがインクリメントをスマートにすることができ、Python側ではなくデータベース側で起こることができます。データベース内でそれをすることは、データの破損に対して脆弱ではないためです(例えば、2つのクライアントは2つの1つの代わりに1つの増分のみで同時に増分しようとしようとしています)。絶縁レベルを設定するか、または絶縁レベルを維持する場合は、Pythonの増分を行うことが可能ですが、なぜあなたが必要でなければ気にしないのか?

k 2>

SET no_of_logins = no_of_logins + 1のようなSQLを生成するコードを2回インクリメントしようとしている場合は、incrementsの間にコミットまたは少なくともフラッシュする必要があります。そうしないと、合計で1つの増分だけが取得されます。

# 6 (bad)
user.no_of_logins = User.no_of_logins + 1
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6

# 7 (ok)
user.no_of_logins = User.no_of_logins + 1
session.flush()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
.

user=User.query.filter_by(username=form.username.data).first()ステートメントの助けを借りて、指定されたユーザーがuser変数で取得されます。

user.no_of_logins += 1のような新しいオブジェクト変数の値を変更して、sessionのCOMMITメソッドで変更を保存できます。

私は電文ボットを書いて、アップデート行に問題がある。 モデルがある場合は、この例を使用してください。

def update_state(chat_id, state):
    try:
        value = Users.query.filter(Users.chat_id == str(chat_id)).first()
        value.state = str(state)
        db.session.flush()
        db.session.commit()
        #db.session.close()
    except:
        print('Error in def update_state')
.

db.session.flush()を使用するのはなぜですか?それが>>> sqlalchemy:flush()とコミットの違いは何ですか?()?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top