2013-01-17 11 views
9

मैं SQLAlchemy के माध्यम से/अद्यतन थोक पंक्तियां सम्मिलित की जरूरत है। और पंक्तियों को सम्मिलित करें।SQLAlchemy: को रोकने के लिए स्वत: बंद करने

मैं session.execute साथ यह करने की कोशिश की:

>>> posts = db.session.execute(Post.__table__.insert(), [{'title': 'dfghdfg', 'content': 'sdfgsdf', 'topic': topic}]*2) 
>>> posts.fetchall() 

ResourceClosedError      Traceback (most recent call last) 

और इंजन के साथ:

In [17]: conn = db.engine.connect() 

In [18]: result = conn.execute(Post.__table__.insert(), [{'title': 'title', 'content': 'content', 'topic': topic}]*2) 

In [19]: print result.fetchall() 
ResourceClosedError: This result object does not return rows. It has been closed automatically. 

एक ही प्रतिक्रिया एक वस्तु अपने आप बंद हो गया है। इसे कैसे रोकें?

उत्तर

8

सबसे पहले इस सवाल का जवाब - "स्वत: बंद करने को रोकने" पर।

SQLAlchemy डीबीएपीआई निष्पादित() या execemany() को सम्मिलित करता है और कोई भी चयन क्वेरी नहीं करता है। तो आपके द्वारा प्राप्त अपवाद व्यवहार की उम्मीद है। ResultProxy ऑब्जेक्ट डालने के बाद निष्पादित क्वेरी निष्पादित wraps डीबी-एपीआई कर्सर जो .fetchall() पर करने की अनुमति नहीं देता है। एक बार .fetchall() विफल हो जाता है, ResultProxy उपयोगकर्ता को आपके अपवाद को अपवाद देता है।

जानकारी जिन्हें आप सम्मिलित/अपडेट करने के बाद प्राप्त कर सकते हैं/हटाने आपरेशन (डेटाबेस और डेटाबेस ड्राइवर के आधार पर) या प्रभावित पंक्तियों की संख्या ऑटो वेतन वृद्धि के बाद प्राथमिक कुंजी का मान होगा।

  • .inserted_primary_key
  • .last_inserted_params()
  • .lastrowid
  • आदि

:

अपने लक्ष्य को इस तरह की जानकारी प्राप्त करने के लिए है, तो जैसे ResultProxy methods and attributes जाँच पर विचार दूसरा जवाब - "थोक सम्मिलन/अद्यतन कैसे करें और परिणाम प्राप्त करें एनजी पंक्तियां "।

जबकि DBAPI का उपयोग कर एकल डालने क्वेरी कर डाला पंक्तियों लोड करने के लिए कोई तरीका नहीं है। एसक्यूएलकेमी एसक्यूएल एक्सप्रेशन एपीआई जो आप थोक सम्मिलित/अपडेट करने के लिए उपयोग कर रहे हैं, वह भी ऐसी कार्यक्षमता प्रदान नहीं करता है। SQLAlchemy डीबीएपीआई निष्पादन() कॉल चलाता है और ड्राइवर कार्यान्वयन पर निर्भर करता है। विवरण के लिए this section of documentation देखें।

समाधान के लिए एक रास्ता है कि हर रिकॉर्ड रिकॉर्ड की पहचान करने के प्राकृतिक कुंजी (स्तंभों 'मान जो अनोखे तरीके से रिकॉर्ड की पहचान के संयोजन) के लिए होता है में अपनी मेज डिजाइन करने के लिए किया जाएगा। तो सम्मिलित/अद्यतन/चयन प्रश्न एक रिकॉर्ड को लक्षित करने में सक्षम होंगे। ऐसा करने के बाद पहले थोक सम्मिलित/अद्यतन करना और फिर मूल कुंजी द्वारा चयन क्वेरी करना संभव होगा। इस प्रकार आपको autoincremented प्राथमिक कुंजी मान जानने की आवश्यकता नहीं होगी।

एक अन्य विकल्प: आप वस्तुओं बनाने के लिए SQLAlchemy Object Relational API उपयोग कर सकते हैं हो सकता है - तो SQLAlchemy आप के लिए executemany साथ एक क्वेरी करने में डालने का अनुकूलन करने की कोशिश कर सकते हैं। ओरेकल डीबी का उपयोग करते समय यह मेरे लिए काम करता था। बॉक्स के अपडेट के लिए कोई अनुकूलन नहीं होगा। कुशल बहु-अपडेट विचारों के लिए this SO question चेक

+2

धन्यवाद, तुम मुझे प्रेरित किया। – I159

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