Các ví dụ để làm rõ vấn đề quan trọng trong các bình luận của câu trả lời được chấp nhận
Tôi đã không hiểu nó cho đến khi tôi tự chơi xung quanh nó, vì vậy tôi đoán rằng sẽ có những người khác cũng bối rối. Giả sử bạn đang làm việc với người dùng khi nào id == 6
và no_of_logins == 30
khi nào bạn bắt đầu.
# 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
Điểm
Bằng cách tham chiếu lớp thay vì thể hiện, bạn có thể khiến SQLAlchemy trở nên thông minh hơn về việc tăng, làm cho nó xảy ra ở phía cơ sở dữ liệu thay vì phía Python. Làm điều đó trong cơ sở dữ liệu sẽ tốt hơn vì nó ít dễ bị hỏng dữ liệu hơn (ví dụ: hai khách hàng cố gắng tăng cùng một lúc với kết quả ròng chỉ là một lần tăng thay vì hai lần). Tôi cho rằng có thể thực hiện tăng dần trong Python nếu bạn đặt khóa hoặc tăng mức cô lập, nhưng tại sao phải bận tâm nếu bạn không phải làm vậy?
Một cảnh báo
Nếu bạn sẽ tăng hai lần thông qua mã tạo ra SQL như thế nào SET no_of_logins = no_of_logins + 1
, thì bạn sẽ cần phải cam kết hoặc ít nhất là xóa giữa các mức tăng, nếu không, bạn sẽ chỉ nhận được tổng số gia tăng:
# 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