Exemplos para esclarecer a questão importante nos comentários da resposta aceita
Eu não entendi até brincar comigo mesma, então imaginei que haveria outros que também estavam confusos. Digamos que você esteja trabalhando no usuário de quem id == 6
e de quem no_of_logins == 30
quando iniciar.
# 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
O ponto
Ao referenciar a classe em vez da instância, você pode fazer com que o SQLAlchemy seja mais inteligente em incrementar, fazendo com que isso aconteça no lado do banco de dados e não no lado do Python. Fazê-lo no banco de dados é melhor, pois é menos vulnerável à corrupção de dados (por exemplo, dois clientes tentam incrementar ao mesmo tempo com um resultado líquido de apenas um incremento em vez de dois). Presumo que seja possível fazer o incremento no Python se você definir bloqueios ou aumentar o nível de isolamento, mas por que se preocupar se não for necessário?
Uma ressalva
Se você pretende incrementar duas vezes por meio de um código que produz SQL SET no_of_logins = no_of_logins + 1
, precisará confirmar ou, pelo menos, liberar entre os incrementos; caso contrário, você receberá apenas um incremento no total:
# 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