ตัวอย่างเพื่อชี้แจงประเด็นสำคัญในความคิดเห็นของคำตอบที่ยอมรับ
ฉันไม่เข้าใจจนกว่าฉันจะเล่นกับมันด้วยตัวเองดังนั้นฉันจึงคิดว่าจะมีคนอื่นที่สับสนเช่นกัน สมมติว่าคุณกำลังทำงานกับผู้ใช้ที่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