2012-03-12 9 views
64

Suponga que la tabla tiene tres columnas: username, password y no_of_logins.Cómo actualizar la entrada de la fila SQLAlchemy?

Cuando el usuario intenta iniciar sesión, es marcada por una entrada con una consulta como

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

Si contraseña coincide, se procede aún más. Lo que me gustaría hacer es contar cuántas veces el usuario inició sesión. Por lo tanto, cada vez que inicia sesión con éxito, me gustaría incrementar el campo no_of_logins y almacenarlo de nuevo en la tabla de usuarios. No estoy seguro de cómo ejecutar la consulta de actualización con SqlAlchemy.

Respuesta

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

http://stackoverflow.com/a/2334917/125507 dice que esto es una mala manera de hacerlo. ¿Qué sucede si la fila aún no existe? – endolith

+2

Según el enlace del endolito, 'user.no_of_logins + = 1' puede crear condiciones de carrera. En su lugar, use 'user.no_of_logins = user.no_of_logins + 1'. Traducido a sql, la última forma correcta se convierte en: 'SET no_of_logins = no_of_logins + 1'. – ChaimG

+0

@ChaimG Supongo que quería decir 'user.no_of_logins = User.no_of_logins + 1', o en otras palabras usar el atributo instrumentado del modelo para producir una expresión SQL. Como es su comentario muestra 2 maneras de producir la misma condición de carrera. –

1

Con la ayuda de user=User.query.filter_by(username=form.username.data).first() comunicado obtendrá el usuario especificado en user variable.

Ahora puede cambiar el valor de la nueva variable de objeto como user.no_of_logins += 1 y guardar los cambios con el método de confirmación session.

169

Hay varias maneras de utilizar UPDATEsqlalchemy

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

Esta respuesta cubre todos los escenarios. – Ricardo

+1

Utilizo '' 'setattr (query_result, key, value)' '' para algunas actualizaciones en Flask SQLAlchemy seguido de un commit. ¿Alguna razón para descontar este patrón? –

+1

@datamafia: Puede usar 'setattr (query_result, key, value)', que es exactamente equivalente a escribir 'query_result.key = value' –

Cuestiones relacionadas