मैं एक थोक प्रविष्टि-या-अपडेट करने के लिए पोस्टग्रेस बैकएंड के साथ स्क्लेक्लेमी का उपयोग कर रहा हूं। प्रदर्शन में सुधार करने की कोशिश करने के लिए, मैं हर हज़ार पंक्तियों में केवल एक बार प्रतिबद्ध करने का प्रयास कर रहा हूं:मैं SQLQchechemy के साथ एक थोक सम्मिलन-या-अद्यतन कुशलतापूर्वक कैसे करूं?
trans = engine.begin()
for i, rec in enumerate(records):
if i % 1000 == 0:
trans.commit()
trans = engine.begin()
try:
inserter.execute(...)
except sa.exceptions.SQLError:
my_table.update(...).execute()
trans.commit()
हालांकि, यह काम नहीं कर रहा है। ऐसा लगता है कि जब INSERT विफल हो जाता है, तो यह चीजों को एक अजीब स्थिति में छोड़ देता है जो अद्यतन को होने से रोकता है। क्या यह स्वचालित रूप से लेनदेन वापस ले रहा है? यदि हां, तो क्या इसे रोका जा सकता है? मैं नहीं चाहता कि मेरा पूरा लेनदेन किसी समस्या की स्थिति में वापस लुढ़का जाए, यही कारण है कि मैं अपवाद को पहली जगह पकड़ने की कोशिश कर रहा हूं।
त्रुटि संदेश जो मैं प्राप्त कर रहा हूं, बीटीडब्लू, "sqlalchemy.exc.InternalError: (InternalError) वर्तमान लेनदेन निरस्त कर दिया गया है, लेनदेन ब्लॉक के अंत तक अनदेखा आदेश", और यह अद्यतन() पर निष्पादित होता है। निष्पादित करें () कॉल करें।
"यदि किसी लेनदेन में कोई त्रुटि होती है, तो यह पूरे लेनदेन को वापस लुढ़कने के लिए मजबूर करता है। मैं इसे पोस्टग्रेज़ डिज़ाइन बग मानता हूं।" - क्या यह लेनदेन का मुद्दा नहीं है? [विकिपीडिया] से (http: //en.wikipedia।संगठन/विकी/डेटाबेस_ट्रांसेक्शन): "लेनदेन एक 'सब-या-कुछ भी नहीं' प्रस्ताव प्रदान करते हैं, यह बताते हुए कि किसी डेटाबेस में किए गए प्रत्येक कार्य-इकाई को या तो पूरी तरह से पूर्ण होना चाहिए या इसका कोई प्रभाव नहीं होना चाहिए।" – spiffytech
@Spiffytech अच्छी प्रतिक्रिया। यह वास्तव में मुझे एलओएल बना दिया। –