अगर आप कमिट कर सकते हैं तो फ्लश क्यों करें?
डेटाबेस और sqlalchemy के साथ काम करने के लिए किसी नए के रूप में, पिछले जवाब - कि flush()
एसबी को एसक्यूएल बयान भेजता है और commit()
उन्हें जारी रखता है - मेरे लिए स्पष्ट नहीं थे। परिभाषाएं समझ में आती हैं, लेकिन यह परिभाषाओं से तुरंत स्पष्ट नहीं है कि आप सिर्फ कमिट करने के बजाय फ्लश का उपयोग क्यों करेंगे।
चूंकि एक कमिट हमेशा फ्लश करता है ( https://docs.sqlalchemy.org/en/13/orm/session_basics.html#committing ) ये ध्वनि वास्तव में समान हैं। मुझे लगता है कि उजागर करने के लिए बड़ा मुद्दा यह है कि एक फ्लश स्थायी नहीं है और इसे पूर्ववत किया जा सकता है, जबकि एक प्रतिबद्ध स्थायी है, इस अर्थ में कि आप डेटाबेस को अंतिम प्रतिबद्ध को पूर्ववत् करने के लिए नहीं कह सकते हैं (मुझे लगता है)
@snapshoe इस बात पर प्रकाश डालता है कि यदि आप डेटाबेस को क्वेरी करना चाहते हैं और ऐसे परिणाम प्राप्त करना चाहते हैं जिसमें नई जोड़े गए ऑब्जेक्ट शामिल हैं, तो आपको पहले फ्लश करना होगा (या प्रतिबद्ध, जो आपके लिए फ्लश होगा)। शायद यह कुछ लोगों के लिए उपयोगी है, हालांकि मुझे यकीन नहीं है कि आप प्रतिबद्ध होने के बजाय फ्लश क्यों करना चाहते हैं (तुच्छ उत्तर के अलावा यह पूर्ववत किया जा सकता है)।
एक अन्य उदाहरण में मैं एक स्थानीय DB और एक दूरस्थ सर्वर के बीच दस्तावेजों को सिंक्रनाइज़ कर रहा था, और यदि उपयोगकर्ता ने रद्द करने का फैसला किया, तो सभी जोड़ / अपडेट / हटाएं पूर्ववत होना चाहिए (अर्थात कोई आंशिक सिंक नहीं, केवल पूर्ण सिंक)। एकल दस्तावेज़ को अपडेट करते समय मैंने पुरानी पंक्ति को हटाने और दूरस्थ सर्वर से अपडेट किए गए संस्करण को जोड़ने का निर्णय लिया है। यह पता चला है कि जिस तरह से सीक्वलकेमी लिखा गया है, उसके कारण जब कोई गारंटी नहीं होती है, तो संचालन का क्रम। इसके परिणामस्वरूप एक डुप्लिकेट संस्करण (पुराने को हटाने का प्रयास करने से पहले) जोड़ा गया, जिसके परिणामस्वरूप DB ने एक अद्वितीय बाधा को विफल कर दिया। इसके आसपास जाने के लिए मैंने इसका इस्तेमाल किया flush()
ताकि ऑर्डर बरकरार रहे, लेकिन अगर बाद में सिंक प्रक्रिया विफल हो जाती है, तो मैं अभी भी पूर्ववत कर सकता हूं।
इस पर मेरी पोस्ट देखें: क्या sqlalchemy में कमिट करने के लिए ऐड बनाम डिलीट का कोई ऑर्डर है
इसी तरह, किसी ने जानना चाहा कि क्या कमिट करते समय एड ऑर्डर को बनाए रखा जाता है, यानी अगर मैं ऐड करता हूं , object1
तो डेटाबेस में जोड़ा जाता है इससे पहले क्या SQLAlchemy ऑर्डर को सत्र में जोड़ने पर ऑर्डर सेव करता है?object2
object1
object2
फिर, यहाँ संभवतः फ्लश () का उपयोग वांछित व्यवहार को सुनिश्चित करेगा। इसलिए सारांश में, फ्लश के लिए एक उपयोग ऑर्डर गारंटी (मुझे लगता है) प्रदान करने के लिए है, फिर भी अपने आप को "पूर्ववत" विकल्प देने की अनुमति देता है जो प्रतिबद्ध नहीं करता है।
ऑटोफ्लश और ऑटोकॉमिट
ध्यान दें, किसी अद्यतन डेटाबेस पर क्वेरीज़ को सुनिश्चित करने के लिए ऑटोफ़्लश का उपयोग किया जा सकता है क्योंकि क्वेरी निष्पादित करने से पहले sqlalchemy फ्लश होगा। https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Session.params.autoflush
ऑटोकॉमिट कुछ और है जो मुझे पूरी तरह से समझ में नहीं आता है लेकिन ऐसा लगता है कि इसका उपयोग हतोत्साहित करता है:
https://docs.sqlalchemy.org/en/13/orm/session_api.html#sqlalchemy.orm.session.Spar.params। autocommit
स्मृति उपयोग
अब मूल प्रश्न वास्तव में स्मृति उद्देश्यों के लिए फ्लश बनाम प्रतिबद्ध के प्रभाव के बारे में जानना चाहता था। जैसा कि जारी रखने या न करने की क्षमता कुछ है जो डेटाबेस प्रदान करता है (मुझे लगता है), बस निस्तब्धता डेटाबेस को लोड करने के लिए पर्याप्त होना चाहिए - हालांकि कमिटिंग को चोट नहीं पहुंचनी चाहिए (वास्तव में शायद मदद करता है - नीचे देखें) यदि आप पूर्ववत करने की परवाह नहीं करते हैं ।
sqlalchemy उन वस्तुओं के लिए कमजोर संदर्भों का उपयोग करता है जिन्हें फ्लश किया गया है: https://docs.sqlalchemy.org/en/13/orm/session_state_management.html#session-referencing-bevivior
इसका मतलब यह है कि यदि आपके पास स्पष्ट रूप से कहीं पर कोई वस्तु नहीं है, जैसे सूची या तानाशाही में, sqlalchemy इसे स्मृति में नहीं रखेगा।
हालाँकि, फिर आपके पास चिंता करने के लिए चीजों का डेटाबेस पक्ष है। संभवत: बिना कमिट किए फ्लशिंग लेनदेन को बनाए रखने के लिए कुछ मेमोरी पेनल्टी के साथ आता है। फिर से, मैं इसके लिए नया हूं लेकिन यहां एक लिंक दिया गया है जो ठीक यही सुझाव देता है: https://stackoverflow.com/a/15305650/730365
दूसरे शब्दों में, कमिट्स को मेमोरी के उपयोग को कम करना चाहिए, हालांकि संभवतः स्मृति और प्रदर्शन के बीच एक व्यापार बंद है। दूसरे शब्दों में, आप शायद हर एक डेटाबेस परिवर्तन, एक समय में (प्रदर्शन कारणों के लिए) नहीं करना चाहते हैं, लेकिन बहुत लंबे समय तक प्रतीक्षा करने से मेमोरी का उपयोग बढ़ेगा।