पर जारी रखने से पहले मेरा एप्लिकेशन उपयोगकर्ताओं को Site
ऑब्जेक्ट्स बनाने और हटाने की अनुमति देता है। मैंने इसे session.add()
और session.delete()
का उपयोग करके कार्यान्वित किया है। इसके बाद मेरे पास 'सेव' और 'रीसेट' बटन हैं जो session.commit()
और session.rollback()
पर कॉल करते हैं।एक एसक्यूएलकेमी सत्र से किसी ऑब्जेक्ट को
यदि मैं एक नया Site
जोड़ता हूं, तो इसे सहेजें/प्रतिबद्ध करें, और फिर इसे हटाएं, सब कुछ ठीक हो जाता है। हालांकि, अगर मैं सहेजे जाने से पहले सत्र से ऑब्जेक्ट को निकालने का प्रयास करता हूं, तो मुझे 'जारी नहीं' त्रुटि मिलती है।
कोड:
self.newSite = Site('foo')
self.session.add(self.newSite)
print self.session.new
self.session.delete(self.newSite)
आउटपुट:
IdentitySet([<Site('foo')>])
Traceback (most recent call last):
File "C:\Program Files\Eclipse\dropins\plugins\org.python.pydev.debug_2.2.1.2011071313\pysrc\pydevd_comm.py", line 744, in doIt
result = pydevd_vars.evaluateExpression(self.thread_id, self.frame_id, self.expression, self.doExec)
File "C:\Program Files\Eclipse\dropins\plugins\org.python.pydev.debug_2.2.1.2011071313\pysrc\pydevd_vars.py", line 375, in evaluateExpression
result = eval(compiled, updated_globals, frame.f_locals)
File "<string>", line 1, in <module>
File "C:\Python27\Lib\site-packages\sqlalchemy\orm\session.py", line 1245, in delete
mapperutil.state_str(state))
InvalidRequestError: Instance '<Site at 0x1ed5fb0>' is not persisted
मैं समझता हूँ कि यहाँ क्या हो रहा है, लेकिन मुझे यकीन है कि मैं क्या बजाय करना चाहिए नहीं कर रहा हूँ।
क्या सत्र से एक अभी तक जारी वस्तु को हटाने का कोई अन्य तरीका है? या क्या मुझे हटाने की कोशिश करने से पहले session.flush()
पर कॉल करना चाहिए, अगर मैं जिस वस्तु को हटाना चाहता हूं, उसे अभी तक फ़्लश नहीं किया गया है?
यदि यह बाद वाला है, तो session.query()
ऑटो-फ्लश (सुनिश्चित करें कि लंबित वस्तुएं क्वेरी परिणामों में दिखाई देती हैं) सुनिश्चित करें, लेकिन session.delete()
नहीं (जो सुनिश्चित करेगा कि लंबित वस्तुओं को बिना त्रुटि के हटाया जा सकता है)।
मैं माइक से सहमत हूं कि 'हटाएं' अधिक क्षमाशील हो सकता है। हालांकि, वर्तमान स्थिति बहुत सरल है - अन्य संबंधित वस्तुएं हो सकती हैं जो स्पष्ट रूप से या निहित रूप से (संबंधों के माध्यम से) एक ही सत्र में जोड़े गए थे और नहीं। इसलिए, आईएमओ, सबसे साफ तरीका सत्र पर 'रोलबैक() 'करना है। – van
धन्यवाद, यह अब समझ में आता है। तो जब डिलीट बटन क्लिक किया जाता है, तो तर्क क्या होना चाहिए? कुछ कोशिश करें 'session :de.delete (foo); InvalidRequestError को छोड़कर: session.expunge (foo) '? या, [इस उत्तर] के अनुसार (http://stackoverflow.com/a/3897845/665488), शायद: 'if_identity (foo): session.delete (foo); अन्य: session.expunge (foo) '? –
मैं शायद कहूंगा "अगर सत्र में ऑब्जेक्ट। नया: एक्सप्लोर करें: हटाएं" – zzzeek