2011-11-24 13 views
34

से बाध्य न करें विभिन्न कारणों से, मैं डेटाबेस से ऑब्जेक्ट्स का संग्रह प्राप्त करने की कोशिश कर रहा हूं और इसे किसी अन्य प्रक्रिया में पास कर रहा हूं जो डेटाबेस से कनेक्ट नहीं है। मेरे कोड के नीचे एक तरह लग रहा है, लेकिन मैंSQLAlchemy, ऑब्जेक्ट को सत्र

sqlalchemy.exc.UnboundExecutionError: Instance <MyClass at 0x8db7fec> is not bound to a Session; attribute refresh operation cannot proceed 

मिलती रहती है जब मैं get_list() विधि के बाहर मेरी सूची के तत्वों को देखने के लिए प्रयास करें।

def get_list (obj): 
    sesson = Session() 
    lst = session.query(MyClass).all() 
    session.close() 
    return lst 

हालांकि, अगर मैं इस

def get_list_bis (obj) 
    session = Session() 
    return session.query(MyClass).all() 

का उपयोग मैं तत्वों का उपयोग लेकिन जब से इसे बंद कर दिया नहीं किया गया था सत्र की स्थिति के बारे में चिंता करने में सक्षम हूँ।

मुझे यहां क्या याद आ रही है?

उत्तर

39

यदि आप सत्र के दायरे से बाहर उपयोग करने के लिए सत्र पूछने के द्वारा उत्पादित वस्तुओं का एक गुच्छा चाहते हैं, तो आपको सत्र के लिए expunge की आवश्यकता है। मान लीजिए कि सत्र तुरंत पहले में बंद नहीं है, पसंद करते हैं और आम तौर पर

session.expunge_all() 

से पहले

session.close() 

,:

अपना पहला समारोह उदाहरण में, आप एक लाइन जोड़ने की आवश्यकता होगी उदाहरण। शायद यह एक ऐसा सत्र है जिसे वेब अनुरोध की पूरी अवधि या उसके जैसा कुछ सक्रिय रखा जाता है। ऐसे मामलों में, आप expunge_all नहीं करना चाहते हैं। आप और अधिक शल्य होना चाहता हूँ जाएगा:

for item in lst: 
    session.expunge(item) 
+17

लेकिन ... लेकिन ... "करीबी() विधि expunge_all() को जारी करती है, और किसी भी लेनदेन/कनेक्शन संसाधनों को जारी करती है।" यह कथन आपके द्वारा संदर्भित पृष्ठ पर है, कम से कम संस्करण 0.6 तक। – Oddthinking

1

मेरे मामले में, मैं भी एक संबंधित इकाई बचत गया था, और यह नुस्खा एक सत्र के भीतर refresh सभी उदाहरणों के लिए मुझे मदद की, तथ्य यह है कि सत्र iterable है लाभ:

map(session.refresh, iter(session)) # call refresh() on every instance 

यह बेहद अप्रभावी है, लेकिन काम करता है। इकाई परीक्षण के लिए ठीक होना चाहिए।

अंतिम नोट: Python3 map() में जनरेटर है और कुछ भी नहीं करेगा। सूची समझों के वास्तविक लूप का उपयोग करें

+4

किसी भी मामले में, यदि आपको परिणाम की परवाह नहीं है तो आपको 'मानचित्र' का उपयोग नहीं करना चाहिए। – ThiefMaster

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