Contoh untuk memperjelas masalah penting dalam komentar jawaban yang diterima
Saya tidak mengerti sampai saya bermain-main dengan itu sendiri, jadi saya pikir akan ada orang lain yang bingung juga. Katakanlah Anda bekerja pada pengguna yang id == 6
dan yang no_of_logins == 30
ketika Anda mulai.
# 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
Inti nya
Dengan mereferensikan kelas alih-alih instance, Anda bisa membuat SQLAlchemy menjadi lebih pintar tentang penambahan, membuatnya terjadi di sisi basis data alih-alih sisi Python. Melakukannya di dalam basis data lebih baik karena kurang rentan terhadap korupsi data (misalnya, dua klien berupaya untuk meningkatkan secara bersamaan dengan hasil bersih hanya satu peningkatan daripada dua). Saya menganggap itu mungkin untuk melakukan penambahan dengan Python jika Anda mengatur kunci atau meningkatkan level isolasi, tetapi mengapa repot-repot jika Anda tidak harus melakukannya?
Peringatan
Jika Anda akan bertambah dua kali melalui kode yang menghasilkan SQL like SET no_of_logins = no_of_logins + 1
, maka Anda harus melakukan atau setidaknya menyiram di antara kenaikan, atau Anda hanya akan mendapatkan satu kenaikan secara 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