2012-03-12 4 views
64

テーブルには、3つの列、username,passwordおよびno_of_loginsがあるとします。パスワードが一致した場合、ユーザーがログインしようとするとSQLAlchemyの行エントリを更新するには?

、それは

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

のようなクエリを持つエントリをチェックしています、彼はさらに進行します。私がしたいのは、ユーザーがログインした回数を数えることです。したがって、彼が正常にログインするたびに、no_of_loginsフィールドをインクリメントしてユーザーテーブルに戻したいと思います。 SqlAlchemyで更新クエリを実行する方法がわかりません。あなたはuser変数で指定されたユーザーを取得しますuser=User.query.filter_by(username=form.username.data).first()文の助けを借りて

答えて

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

http://stackoverflow.com/a/2334917/125507を使用してUPDATEには、いくつかの方法がありますが、これはそれを行うには悪い方法であると言います。行がまだ存在しない場合はどうなりますか? – endolith

+2

endolithのリンクごとに、 'user.no_of_logins + = 1'は競合条件を作成できます。代わりに、 'user.no_of_logins = user.no_of_logins + 1'を使用してください。 sqlに変換された正しい方法は、 'SET no_of_logins = no_of_logins + 1'となります。 – ChaimG

+0

@ChaimG 'user.no_of_logins = User.no_of_logins + 1'を意味すると思います。言い換えれば、モデルのinstrumented属性を使用してSQL式を生成します。あなたのコメントは同じ競争条件を作り出す2つの方法を示しています。 –

1

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

169

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() 
+3

この回答はすべてのシナリオに適用されます。 – Ricardo

+1

私はFlask SQLAlchemyのいくつかの更新に '' setattr(query_result、key、value) '' 'を使ってコミットします。このパターンを割り引く理由は何ですか? –

+1

@datamafia: 'setattr(query_result、key、value)'を使うことができます。これは 'query_result.key = value'と全く同じです。 –

関連する問題