2012-03-12 3 views
64

Supposons que la table comporte trois colonnes: username, password et no_of_logins.Comment mettre à jour l'entrée de ligne SQLAlchemy?

Lorsque l'utilisateur tente de se connecter, il est vérifié pour une entrée avec une requête comme

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

Si des correspondances de mot de passe, il poursuit plus loin. Ce que je voudrais faire est de compter combien de fois l'utilisateur s'est connecté. Ainsi, chaque fois qu'il se connecte avec succès, je voudrais incrémenter le champ no_of_logins et le stocker dans la table des utilisateurs. Je ne suis pas sûr comment exécuter la requête de mise à jour avec SqlAlchemy.

Répondre

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

http://stackoverflow.com/a/2334917/125507 dit que c'est une mauvaise façon de le faire. Aussi, que faire si la ligne n'existe pas encore? – endolith

+2

Selon le lien de l'endolithe, 'user.no_of_logins + = 1' peut créer des conditions de concurrence. Au lieu de cela, utilisez 'user.no_of_logins = user.no_of_logins + 1'. Traduit en sql la dernière manière correcte devient: 'SET no_of_logins = no_of_logins + 1'. – ChaimG

+0

@ChaimG Je suppose que vous vouliez dire 'user.no_of_logins = User.no_of_logins + 1', ou en d'autres termes utilisez l'attribut instrumenté du modèle pour produire une expression SQL. Comme il est votre commentaire affiche 2 façons de produire la même condition de course. –

1

Avec l'aide de user=User.query.filter_by(username=form.username.data).first() déclaration, vous obtiendrez l'utilisateur spécifié dans la variable user.

Maintenant, vous pouvez modifier la valeur de la nouvelle variable d'objet comme user.no_of_logins += 1 et enregistrer les modifications avec la méthode de validation session.

169

Il existe plusieurs façons de UPDATE utilisant 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

Cette réponse couvre tous les scénarios. – Ricardo

+1

J'utilise '' 'setattr (query_result, key, value)' '' pour certaines mises à jour dans Flask SQLAlchemy suivi d'un commit. Une raison pour ne pas tenir compte de ce modèle? –

+1

@datamafia: Vous pouvez utiliser 'setattr (query_result, clé, valeur)', ce qui équivaut exactement à écrire 'query_result.key = value' –

Questions connexes