Приклади для з'ясування важливого питання в коментарях прийнятої відповіді
Я не розумів цього, доки сам з ним не розігрувався, тому зрозумів, що будуть і інші, хто також збентежений. Скажіть, ви працюєте над користувачем, чий id == 6
і чий, no_of_logins == 30
коли ви починаєте.
# 1 (bad)
user.no_of_logins += 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6
# 2 (bad)
user.no_of_logins = user.no_of_logins + 1
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6
# 3 (bad)
setattr(user, 'no_of_logins', user.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = 31 WHERE user.id = 6
# 4 (ok)
user.no_of_logins = User.no_of_logins + 1
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
# 5 (ok)
setattr(user, 'no_of_logins', User.no_of_logins + 1)
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
Точка
Посилаючись на клас замість екземпляра, ви можете зробити SQLAlchemy розумнішою щодо збільшення, зробивши це на стороні бази даних, а не на стороні Python. Робити це в базі даних краще, оскільки вона менш вразлива для корупції даних (наприклад, два клієнти намагаються збільшити одночасно з чистим результатом лише один приріст замість двох). Я припускаю, що можна зробити приріст у Python, якщо встановити блокування або збільшити рівень ізоляції, але навіщо турбуватися, якщо цього не потрібно?
Застереження
Якщо ви збираєтесь збільшувати двічі за допомогою коду, що створює подібний SQL SET no_of_logins = no_of_logins + 1
, тоді вам потрібно буде здійснити або принаймні прострочити між кроками, інакше ви отримаєте лише один приріст:
# 6 (bad)
user.no_of_logins = User.no_of_logins + 1
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
# 7 (ok)
user.no_of_logins = User.no_of_logins + 1
session.flush()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6
user.no_of_logins = User.no_of_logins + 1
session.commit()
# result: UPDATE user SET no_of_logins = no_of_logins + 1 WHERE user.id = 6