2011-09-19 18 views
19

क्या किसी को पता है कि SQLAlchemy में session.commit() और session.flush() के बीच मुख्य अंतर क्या है?session.commit() और session.flush() के बीच क्या अंतर है?

the documentation से
+3

प्रलेखन ("फ्लशिंग" और "करने से" http://www.sqlalchemy.org/docs/orm/session.html#flushing में) में से कौन सा पहलू आप स्पष्ट नहीं मिल रहा है ? – NPE

उत्तर

15

यहां documentation से कुछ प्रासंगिक उद्धरण दिए गए हैं।

फ्लश:

Session उसके डिफ़ॉल्ट विन्यास के साथ प्रयोग किया जाता है, फ्लश कदम लगभग हमेशा पारदर्शी रूप से किया जाता है। विशेष रूप से, फ़्लश किसी भी व्यक्तिगत क्वेरी जारी होने से पहले, साथ ही साथ commit() लेनदेन से पहले कॉल के पहले होता है।

प्रतिबद्ध:

commit() वर्तमान लेन-देन के लिए इस्तेमाल किया जाता है। यह हमेशा flush() को किसी भी शेष स्थिति को डेटाबेस पर फ़्लश करने के लिए पहले से जारी करता है; यह "ऑटोफ्लश" सेटिंग से स्वतंत्र है। यदि कोई लेनदेन मौजूद नहीं है, तो यह एक त्रुटि उठाता है। ध्यान दें कि सत्र का डिफ़ॉल्ट व्यवहार यह है कि "लेनदेन" हमेशा मौजूद होता है; यह व्यवहार autocommit=True सेट करके अक्षम किया जा सकता है। ऑटोोकॉमिट मोड में, लेनदेन begin() विधि को कॉल करके शुरू किया जा सकता है।

4

सीधे:

commit() वर्तमान लेन-देन के लिए इस्तेमाल किया जाता है। डेटाबेस में किसी भी शेष राज्य को फ्लश करने के लिए यह हमेशा flush() को जारी करता है।

9

सबसे आसान तरीका है मुझे पता है कि कैसे इन करना क्या समझाने के लिए केवल आपके दिखाने के लिए, echo=True उपयोग कर रहा है:

>>> session.flush() 
BEGIN (implicit) 
INSERT INTO users (username, password) VALUES (?, ?) 
('alice', None) 
>>> session.commit() 
COMMIT 
>>> 

flush() का कारण बनता है डेटा डेटाबेस के लिए भेजा जाना। commit()COMMIT का कारण बनता है, जो डेटाबेस को केवल उस डेटा को रखने के लिए कहता है जो अभी भेजा गया था। जैसा कि अन्य ने कहा है, commit() भी flush() होने की आवश्यकता होगी, यदि इसकी आवश्यकता हो।

3

हालांकि उपर्युक्त उत्तर सही हैं, फ्लश की सबसे उपयोगी विशेषता डेटाबेस में तालिका में किए गए परिवर्तनों को कोड में संबंधित ऑब्जेक्ट में लागू करने में है। यहाँ एक उदाहरण है, मान लीजिए आप एक उपयोगकर्ता रजिस्टर और आप उसकी आईडी वापस देना चाहते हैं,

u = User(name,address,phone) #id is autogenerated 
session.add(u) 
session.commit() #calls flush beforehand, but we need it after the commit 
session.flush() #updates the objects of the session 
print(u.id) #id field of the User object updated after the flush 

आप उसकी आईडी प्राप्त करने के लिए फिर से क्वेरी की जरूरत नहीं है !!आशा है कि इस मदद करता है

0

flush() स्मृति में आयोजित वस्तु/वस्तुओं की वर्तमान स्थिति के साथ अपने डेटाबेस सिंक्रनाइज़ करेगा लेकिन यह लेन-देन के लिए प्रतिबद्ध नहीं है। इसलिए, अगर आपको flush() के बाद कोई अपवाद मिलता है, तो लेनदेन वापस लुढ़का जाएगा। commit() का उपयोग करके एक बार में बड़े डेटा को करने के बजाय flush() का उपयोग करके डेटा के छोटे हिस्सों के साथ आप अपने डेटाबेस को सिंक्रनाइज़ कर सकते हैं और Out Of Memory अपवाद प्राप्त करने के जोखिम का सामना कर सकते हैं।

commit() डाटाबेस स्थायी रूप से डेटा संग्रहीत करेगा। एक बार commit() सफल होने के बाद आप अपने लेनदेन को रोलबैक नहीं कर सकते हैं।

स्रोत: https://stackoverflow.com/a/26976077/4115031

संबंधित मुद्दे