Przykłady wyjaśniające ważną kwestię w komentarzach zaakceptowanej odpowiedzi
Nie rozumiałem tego, dopóki sam się tym nie bawiłem, więc pomyślałem, że będą też inni, którzy będą zdezorientowani. Powiedzmy, że pracujesz nad użytkownikiem, którego id == 6
i którego w no_of_logins == 30
momencie rozpoczęcia.
user.no_of_logins += 1
user.no_of_logins = user.no_of_logins + 1
setattr(user, 'no_of_logins', user.no_of_logins + 1)
user.no_of_logins = User.no_of_logins + 1
setattr(user, 'no_of_logins', User.no_of_logins + 1)
Punkt
Odwołując się do klasy zamiast do instancji, możesz sprawić, że SQLAlchemy będzie mądrzejszy w zwiększaniu, sprawiając, że dzieje się to po stronie bazy danych zamiast po stronie Pythona. Robienie tego w ramach bazy danych jest lepsze, ponieważ jest mniej podatne na uszkodzenie danych (np. Dwóch klientów próbuje dokonać inkrementacji w tym samym czasie z wynikiem netto tylko jednej inkrementacji zamiast dwóch). Zakładam, że możliwe jest zwiększenie wartości w Pythonie, jeśli ustawisz blokady lub podniesiesz poziom izolacji, ale po co zawracać sobie głowę, jeśli nie musisz?
Zastrzeżenie
Jeśli zamierzasz zwiększać dwukrotnie za pomocą kodu, który generuje SQL SET no_of_logins = no_of_logins + 1
, wtedy będziesz musiał zatwierdzić lub przynajmniej opróżnić między przyrostami, w przeciwnym razie otrzymasz tylko jeden przyrost w sumie:
user.no_of_logins = User.no_of_logins + 1
user.no_of_logins = User.no_of_logins + 1
session.commit()
user.no_of_logins = User.no_of_logins + 1
session.flush()
user.no_of_logins = User.no_of_logins + 1
session.commit()