स्वीकृत उत्तर की टिप्पणियों में महत्वपूर्ण मुद्दे को स्पष्ट करने के लिए उदाहरण
मैं इसे तब तक नहीं समझ पाया जब तक मैं खुद इसके साथ नहीं खेलता, इसलिए मुझे लगा कि अन्य लोग भी होंगे जो भ्रमित थे। कहते हैं कि आप उस उपयोगकर्ता पर काम कर रहे हैं 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 को वेतन वृद्धि के बारे में होशियार होने के लिए प्राप्त कर सकते हैं, यह पायथन पक्ष के बजाय डेटाबेस की तरफ से हो सकता है। डेटाबेस में इसे करना बेहतर है क्योंकि यह डेटा भ्रष्टाचार के लिए कम असुरक्षित है (उदाहरण के लिए दो क्लाइंट एक ही समय में दो के बजाय केवल एक वेतन वृद्धि के शुद्ध परिणाम के साथ वेतन वृद्धि का प्रयास करते हैं)। अगर आप ताले लगाते हैं या अलगाव के स्तर से टकराते हैं तो मुझे लगता है कि पायथन में इंक्रीमेंट करना संभव है, लेकिन अगर आपके पास नहीं है तो परेशान क्यों हों?
एक चेतावनी
यदि आप एसक्यूएल का उत्पादन करने वाले कोड के माध्यम से दो बार वेतन वृद्धि करने जा रहे हैं 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