आप एक संदर्भ प्रबंधक के रूप में कनेक्शन का उपयोग करने का प्रयास कर रहे हैं:
with conn:
यह ऑब्जेक्ट इस तरह उपयोग की जाने वाली आवश्यक विधियों को लागू नहीं करता है; यह एक संदर्भ प्रबंधक नहीं है, क्योंकि यह गायब है (कम से कम) __exit__
विधि
।
यदि आप कोई ट्यूटोरियल या दस्तावेज़ पढ़ रहे हैं जो भिन्न . का उपयोग करता है MySQL लाइब्रेरी, ध्यान रखें कि यह सुविधा कुछ द्वारा समर्थित हो सकती है पुस्तकालय, बस यह नहीं। MySQLdb प्रोजेक्ट उदाहरण के लिए, इसका समर्थन करता है।
आपके विशिष्ट . के लिए मामले में, आपको with conn:
. का उपयोग करने की भी आवश्यकता नहीं है बिल्कुल लाइन; आप डेटाबेस में कोई बदलाव नहीं कर रहे हैं, कहीं भी किसी प्रतिबद्धता की आवश्यकता नहीं है। आप with conn:
लाइन (इसके तहत एक कदम के तहत सब कुछ अनइंडेंट करें)। अन्यथा आप संदर्भ प्रबंधक को मैनुअल conn.commit()
. से बदल सकते हैं कहीं और।
वैकल्पिक रूप से, आप @contextlib.contextmanager()
डेकोरेटर
:
from contextlib import contextmanager
@contextmanager
def manage_transaction(conn, *args, **kw):
exc = False
try:
try:
conn.start_transaction(*args, **kw)
yield conn.cursor()
except:
exc = True
conn.rollback()
finally:
if not exc:
conn.commit()
और इसे इस तरह इस्तेमाल करें:
with manage_transaction(conn) as cursor:
# do things, including creating extra cursors
जहां आप connection.start_transaction()
कॉल करें
।