sessionmaker()एक कारखाना है, यह Sessionसिर्फ एक ही स्थान पर नई वस्तुओं को बनाने के लिए कॉन्फ़िगरेशन विकल्पों को प्रोत्साहित करने के लिए है। यह वैकल्पिक है, जिसमें आप आसानी से Session(bind=engine, expire_on_commit=False)कभी भी कॉल कर सकते हैं जब आपको किसी नए की आवश्यकता होती है Session, सिवाय इसके कि क्रिया और अतिरेक, और मैं छोटे पैमाने पर "सहायकों" के प्रसार को रोकना चाहता था कि प्रत्येक ने कुछ नए में इस अतिरेक के मुद्दे पर संपर्क किया और अधिक भ्रमित तरीका।
तो sessionmaker()बस एक उपकरण है जो आपको Sessionवस्तुओं को बनाने में मदद करता है जब आपको उनकी आवश्यकता होती है।
अगला भाग मुझे लगता है कि सवाल यह है कि Session()विभिन्न बिंदुओं पर एक नया बनाने में क्या अंतर है ? जवाब, बहुत ज्यादा नहीं। Sessionआपके द्वारा इसमें डाली गई सभी वस्तुओं के लिए एक कंटेनर है, और फिर यह एक खुले लेनदेन का भी ट्रैक रखता है। जिस समय आप कॉल करते हैं rollback()या commit()लेन-देन खत्म हो जाता है, और Sessionतब तक डेटाबेस से कोई संबंध नहीं होता है जब तक कि उसे फिर से एसक्यूएल का उत्सर्जन करने के लिए नहीं बुलाया जाता है। आपके मैप्ड ऑब्जेक्ट्स के लिए यह लिंक कमजोर रेफ़रेंसिंग है, बशर्ते ऑब्जेक्ट्स लंबित परिवर्तनों से साफ़ हों, तो इस संबंध में भी Sessionजब कोई एप्लिकेशन मैप की गई सभी चीज़ों को खो देता है , तो वह खुद को एक नए राज्य में वापस खाली कर देगा। यदि आप इसे अपने डिफ़ॉल्ट के साथ छोड़ देते हैं"expire_on_commit"सेटिंग, फिर सभी ऑब्जेक्ट्स एक कमिट के बाद समाप्त हो जाते हैं। अगर वह Sessionपांच या बीस मिनट के लिए घूमता है, और अगली बार जब आप इसका उपयोग करते हैं, तो डेटाबेस में सभी प्रकार की चीजें बदल गई हैं, यह अगली बार जब आप उन वस्तुओं तक पहुंचते हैं, तो वे सभी ब्रांड नई स्थिति को लोड करेंगे, भले ही वे स्मृति में बैठे हों बीस मिनट के लिए।
वेब अनुप्रयोगों में, हम आम तौर पर कहते हैं, हे, आप एक Sessionही बार-बार उपयोग करने के बजाय प्रत्येक अनुरोध पर एक नया ब्रांड क्यों नहीं बनाते हैं । यह अभ्यास सुनिश्चित करता है कि नया अनुरोध "स्वच्छ" शुरू हो। यदि पिछले अनुरोध की कुछ वस्तुओं को अभी तक एकत्र नहीं किया गया है, और हो सकता है कि आप बंद हो गए हों "expire_on_commit", हो सकता है कि पिछले अनुरोध से कुछ स्थिति अभी भी घूम रही हो, और वह स्थिति बहुत पुरानी हो सकती है। यदि आप सावधान रहना छोड़ देते हैं expire_on_commitऔर निश्चित रूप से कॉल करने के लिए commit()या rollback()अनुरोध समाप्त होने पर, तो यह ठीक है, लेकिन अगर आप एक नए ब्रांड के साथ शुरुआत करते हैं Session, तो कोई भी सवाल नहीं है जिसे आप साफ करना शुरू कर रहे हैं। तो एक नए के साथ प्रत्येक अनुरोध शुरू करने का विचार हैSessionयह सुनिश्चित करने के लिए कि आप नए सिरे से शुरू कर रहे हैं, और expire_on_commitइस विकल्प को बहुत अधिक वैकल्पिक बनाने के लिए वास्तव में सिर्फ सबसे सरल तरीका है , क्योंकि यह ध्वज एक ऑपरेशन के लिए बहुत अधिक अतिरिक्त एसक्यूएल का उपयोग कर सकता है, जो ऑपरेशन commit()की एक श्रृंखला के बीच में कॉल करता है। यकीन नहीं होता अगर यह आपके सवाल का जवाब देता है।
अगले दौर में आप थ्रेडिंग के बारे में उल्लेख करते हैं। यदि आपका एप्लिकेशन मल्टीथ्रेडेड है, तो हम अनुशंसा करते हैं कि Sessionउपयोग में स्थानीय हो ... कुछ। scoped_session()डिफ़ॉल्ट रूप से यह वर्तमान थ्रेड के लिए स्थानीय बनाता है। एक वेब ऐप में, अनुरोध के लिए स्थानीय वास्तव में और भी बेहतर है। फ्लास्क-SQLAlchemy वास्तव में एक कस्टम "स्कोप फंक्शन" भेजता है scoped_session()ताकि आपको एक अनुरोधित स्कॉप्ड सत्र मिल सके। औसत पिरामिड एप्लिकेशन सत्र को "अनुरोध" रजिस्ट्री में चिपका देता है। इस तरह की योजनाओं का उपयोग करते समय, "नया सत्र अनुरोध पर शुरू करें" विचार चीजों को सीधा रखने के लिए सबसे सरल तरीके की तरह दिखता है।