2012-03-12 13 views
64

Przyjmij, że tabela ma trzy kolumny: username, password i no_of_logins.Jak zaktualizować wpis wiersza SQLAlchemy?

Gdy użytkownik próbuje się zalogować, to sprawdzone wpisu z zapytaniem jak

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

Jeśli hasło pasuje, on przechodzi dalej. Chciałbym policzyć, ile razy użytkownik się zalogował. Dlatego za każdym razem, gdy pomyślnie się zaloguje, chciałbym zwiększyć pole no_of_logins i zapisać je z powrotem do tabeli użytkowników. Nie wiem, jak uruchomić kwerendę aktualizacyjną za pomocą SqlAlchemy.

Odpowiedz

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

http://stackoverflow.com/a/2334917/125507 mówi, że to jest zły sposób to zrobić. A co, jeśli rząd jeszcze nie istnieje? – endolith

+2

Zgodnie z linkiem endolith, "user.no_of_logins + = 1' może stworzyć warunki wyścigu. Zamiast tego użyj 'user.no_of_logins = user.no_of_logins + 1'. W tłumaczeniu na sql ten drugi poprawny sposób staje się: 'SET no_of_logins = no_of_logins + 1'. – ChaimG

+0

@ChaimG Chyba chodziło Ci o 'user.no_of_logins = User.no_of_logins + 1', lub innymi słowy użyj oprzyrządowanego atrybutu modelu do wytworzenia wyrażenia SQL. Ponieważ jest to Twój komentarz, wyświetlane są 2 sposoby na wytworzenie tego samego stanu wyścigu. –

1

Z pomocą user=User.query.filter_by(username=form.username.data).first() rachunku dostaniesz określonego użytkownika w user zmiennej.

Teraz możesz zmienić wartość nowej zmiennej obiektu, na przykład user.no_of_logins += 1 i zapisać zmiany za pomocą metody zatwierdzania session.

169

Istnieje kilka sposobów, aby UPDATE użyciu 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

Ta odpowiedź obejmuje wszystkie scenariusze. – Ricardo

+1

Używam '' 'setattr (query_result, key, value)' '' dla niektórych aktualizacji w Flask SQLAlchemy, a następnie commit. Jakiekolwiek powody, aby zdyskontować ten wzór? –

+1

@ datamafia: Możesz użyć 'setattr (query_result, key, value)', co jest dokładnie równoznaczne z wypisaniem 'query_result.key = value' –

Powiązane problemy