2012-03-12 13 views
64

La tabella delle ipotesi contiene tre colonne: username, password e no_of_logins.Come aggiornare la voce di riga SQLAlchemy?

Quando l'utente tenta di accedere, è controllato per una voce con una query come

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

Se partite da password, si procede ulteriormente. Quello che vorrei fare è contare quante volte l'utente ha effettuato l'accesso. Pertanto, ogni volta che si collega correttamente, desidero incrementare il campo no_of_logins e memorizzarlo nella tabella utente. Non sono sicuro di come eseguire la query di aggiornamento con SqlAlchemy.

risposta

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

http://stackoverflow.com/a/2334917/125507 dice che questo è un brutto modo di farlo. Inoltre, cosa succede se la riga non esiste ancora? – endolith

+2

Come per il link di endolith, 'user.no_of_logins + = 1' può creare condizioni di gara. Usa invece 'user.no_of_logins = user.no_of_logins + 1'. Tradotto in SQL l'ultimo modo corretto diventa: 'SET no_of_logins = no_of_logins + 1'. – ChaimG

+0

@ChaimG Immagino che tu intenda 'user.no_of_logins = User.no_of_logins + 1', o in altre parole usa l'attributo instrumented del modello per produrre un'espressione SQL. Come è il tuo commento mostra 2 modi per produrre la stessa condizione di gara. –

1

Con l'aiuto di user=User.query.filter_by(username=form.username.data).first() dichiarazione si otterrà l'utente specificato nel user variabile.

Ora è possibile modificare il valore della nuova variabile oggetto come user.no_of_logins += 1 e salvare le modifiche con il metodo di commit session.

169

Ci sono diversi modi per UPDATE utilizzando 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

Questa risposta copre tutti gli scenari. – Ricardo

+1

Uso '' 'setattr (query_result, key, value)' '' per alcuni aggiornamenti in Flask SQLAlchemy seguito da un commit. Qualche ragione per scartare questo schema? –

+1

@datamafia: puoi usare 'setattr (query_result, chiave, valore)', che equivale esattamente a scrivere 'query_result.key = value' –

Problemi correlati