Kabul edilen cevabın yorumlarındaki önemli konuyu netleştirmek için örnekler
Ben de onunla oynayana kadar anlamadım, bu yüzden kafası karışan başkalarının da olacağını düşündüm. Kimin id == 6
ve kimin no_of_logins == 30
ne zaman başladığınız üzerinde çalıştığınızı varsayalım.
# 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
Nokta
Örnek yerine sınıfa başvurarak, SQLAlchemy'nin artma konusunda daha akıllı olmasını ve bunun Python tarafı yerine veritabanı tarafında olmasını sağlayabilirsiniz. Veri bozulmasına karşı daha az savunmasız olduğu için veri tabanı içinde yapmak daha iyidir (örneğin, iki istemci aynı anda iki yerine yalnızca bir artım net sonucu ile artış yapmaya çalışır). Kilitleri ayarlarsanız veya izolasyon seviyesini yükseltirseniz, Python'da artış yapmanın mümkün olduğunu varsayıyorum, ama gerekmiyorsa neden zahmet edesiniz?
Bir uyarı
SQL gibi üreten bir kodla iki kez SET no_of_logins = no_of_logins + 1
artıracaksanız, o zaman kaydetmeniz veya en azından artımlar arasında temizlemeniz gerekir, yoksa toplamda yalnızca bir artış elde edersiniz:
# 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