2013-10-02 4 views
10

ठीक है, मैं sqlalchemy और वस्तुओं को ताज़ा करने के बारे में संदेह से निपट रहा हूं!sqlalchemy सत्र में ताज़ा वस्तुओं के बारे में

मैं मैं क्या 2 सत्र में स्थिति में हूँ, और एक ही वस्तु दोनों सत्रों में पूछे किया गया है! ... कुछ खास बात यह है कि मैं सत्र में से एक बंद करने के लिए नहीं कर सकते। मैंने ऑब्जेक्ट को संशोधित किया है और सत्र ए में परिवर्तनों को कम किया है, लेकिन सत्र बी में, गुण प्रारंभिक हैं! संशोधनों! ..

तो ... बिना मैं परिवर्तन संवाद करने के लिए सूचना प्रणाली के कुछ प्रकार लागू होगा या वहाँ एक अंतर्निहित तरीका SQLAlchemy में यह करने के लिए है ??

+1

http://stackoverflow.com/a/18684124/1309352 –

+0

यह रूप में अच्छी तरह मदद कर सकते हैं : http://stackoverflow.com/a/25694346/134904 – kolypto

उत्तर

17

Sessions are designed to work like this। सत्र बी में ऑब्जेक्ट के गुणों को वही रखा जाएगा जब पहली बार सत्र बी में पूछताछ की गई थी। इसके अतिरिक्त, SQLAlchemy अन्य सत्रों में ऑब्जेक्ट्स को स्वचालित रूप से रीफ्रेश करने का प्रयास नहीं करेगा, और न ही मुझे लगता है कि कुछ बनाने का प्रयास करना बुद्धिमान होगा इस तरह।

आप सक्रिय रूप से डेटाबेस में एक एकल लेनदेन के रूप में प्रत्येक सत्र के जीवन काल के बारे में सोच किया जाना चाहिए। सत्रों को कैसे और कब इस तथ्य से निपटने की आवश्यकता है कि उनकी वस्तुएं पुरानी हो सकती हैं, तकनीकी समस्या नहीं है जिसे एसक्लाक्लेमी (या स्क्लाक्लेमी के लिए कोई भी एक्सटेंशन) में निर्मित एल्गोरिदम द्वारा हल किया जा सकता है: यह एक "व्यवसाय" समस्या है जिसका समाधान आपको चाहिए खुद को निर्धारित और कोड करें। "सही" प्रतिक्रिया यह कह सकती है कि यह कोई समस्या नहीं है: सत्र बी के साथ होने वाला तर्क मान्य हो सकता है यदि सत्र बी शुरू होने के समय डेटा का उपयोग किया जाता है। आपकी "समस्या" वास्तव में एक समस्या नहीं हो सकती है। डॉक्स वास्तव में एक entire section on when to use sessions है, लेकिन यदि आप एक एक आकार फिट सभी समाधान के लिए उम्मीद कर रहे हैं यह एक बहुत गंभीर प्रतिक्रिया देता है ...

एक सत्र आम तौर पर एक तार्किक आपरेशन की शुरुआत में निर्माण किया है जहां डेटाबेस पहुंच संभावित रूप से अनुमानित है।

सत्र, जब भी डेटाबेस से बात करने के लिए उपयोग किया जाता है, तो डाटाबेस लेनदेन शुरू होता है जैसे ही यह संचार शुरू होता है। autocommit ध्वज मान लिया जाये कि झूठी की अपनी सिफारिश डिफ़ॉल्ट पर छोड़ दिया जाता है, इस लेन-देन का कार्य प्रगति पर बनी हुई है जब तक सत्र, वापस लुढ़का प्रतिबद्ध है, या बंद कर दिया है। सत्र का उपयोग फिर से किया जाएगा, पिछले लेनदेन के अंत में; से यह इस प्रकार है कि सत्र कई लेनदेन में जीवनकाल रखने में सक्षम है, हालांकि एक समय में केवल एक ही है। हम लेनदेन के दायरे और सत्र के दायरे के रूप में इन दो अवधारणाओं का उल्लेख करते हैं।

निहितार्थ है कि यहाँ SQLAlchemy ORM डेवलपर बढ़ावा दे रही है इन दो स्कोप, सहित न केवल जब स्कोप शुरू और समाप्त अपने या अपने आवेदन में स्थापित करने के लिए है, लेकिन है भी विस्तार उन स्कोप के , उदाहरण के लिए किसी एकल सत्र उदाहरण को स्थानीय को फ़ंक्शन या विधि के भीतर निष्पादन प्रवाह में होना चाहिए, क्या यह संपूर्ण एप्लिकेशन द्वारा उपयोग की जाने वाली वैश्विक वस्तु होनी चाहिए, या कहीं इन के बीच में होना चाहिए।

इस क्षेत्र को निर्धारित करने के लिए डेवलपर पर लगाए गए बोझ एक क्षेत्र है जहां SQLAlchemy ORM के बारे में एक मजबूत राय है कि डेटाबेस का उपयोग कैसे किया जाना चाहिए। कार्य पैटर्न की इकाई विशेष रूप से समय के साथ परिवर्तन जमा करने और उन्हें समय-समय पर फ्लश करने में से एक है, स्थानीय लेन-देन में मौजूद होने के साथ-साथ सिंक में इन-मेमोरी स्थिति को ध्यान में रखते हुए।यह पैटर्न केवल तब प्रभावी होता है जब सार्थक लेन-देन के क्षेत्र मौजूद होते हैं।

सबसे पहले आप कम कर सकते हैं आपका सत्र कितनी देर खुला रहता है,:

जिसके अनुसार, आपको कुछ बातों का आप कैसे काम करता है स्थिति को बदलने के लिए कर सकते हैं। सत्र बी ऑब्जेक्ट से पूछताछ कर रहा है, फिर बाद में आप उस ऑब्जेक्ट (उसी सत्र में) के साथ कुछ कर रहे हैं जिसे आप गुणों को अद्यतित करना चाहते हैं। एक समाधान यह दूसरा ऑपरेशन एक अलग सत्र में किया जाना है।

एक और

# immediately re-load attributes on obj1, obj2 
session.refresh(obj1) 
session.refresh(obj2) 

# expire objects obj1, obj2, attributes will be reloaded 
# on the next access: 
session.expire(obj1) 
session.expire(obj2) 

आप session.refresh() उपयोग कर सकते हैं तुरंत वस्तु का एक अप-टू-डेट संस्करण प्राप्त करने, यहां तक ​​कि पहले से ही सत्र है, समय सीमा समाप्त/रीफ्रेश विधियों का उपयोग करने docs show के रूप में है ... पहले वस्तु पूछताछ की।

+0

Thx! मैं कहना चाहता हूं कि मैंने पूरा सत्र दस्तावेज पढ़ा है। लेकिन, यहां तक ​​कि ऐसा करने के बाद, मुझे कुछ समस्याएं हैं जहां सत्र शुरू करना है और इसे मेरे एप्लिकेशन कोड में कहां समाप्त करना है, और यह दस्तावेज हाहा में नहीं है। –

+0

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

+0

अच्छी तरह से, यह कहकर, मैं एक वर्कफ़्लो बनाने के बारे में और अधिक महसूस करता हूं जो मेरी ज़रूरतों को पूरा करता है, और ऐसे पैटर्न को खोजने की कोशिश नहीं करता जहां यह अस्तित्व में न हो! –

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