मैं जितना संभव हो सके डेटाबेस कनेक्शन को रोकना चाहता हूं, क्योंकि यह कोड एक गहन उपयोग सर्वर पर चलाएगा और यहां लोगों ने मुझे पहले से ही बताया है कि डेटाबेस कनेक्शन हमेशा जितनी जल्दी हो सके बंद होना चाहिए।पायथन में, यह सुनिश्चित करने के लिए कि कोड कनेक्शन छोड़ने से पहले डेटाबेस कनेक्शन हमेशा बंद हो जाएगा?
def do_something_that_needs_database():
dbConnection = MySQLdb.connect(host=args['database_host'], user=args['database_user'], passwd=args['database_pass'], db=args['database_tabl'], cursorclass=MySQLdb.cursors.DictCursor)
dbCursor = dbConnection.cursor()
dbCursor.execute('SELECT COUNT(*) total FROM table')
row = dbCursor.fetchone()
if row['total'] == 0:
print 'error: table have no records'
dbCursor.execute('UPDATE table SET field="%s"', whatever_value)
return None
print 'table is ok'
dbCursor.execute('UPDATE table SET field="%s"', another_value)
# a lot more of workflow done here
dbConnection.close()
# even more stuff would come below
मुझे विश्वास है कि एक डेटाबेस कनेक्शन खोलने जब वहाँ मेज पर कोई पंक्ति है, I'm still really not sure how it works यद्यपि छोड़ देता है।
वैसे भी, शायद यह बुरा डिजाइन है कि मैं execute
के प्रत्येक छोटे ब्लॉक के बाद डीबी कनेक्शन खोल और बंद कर सकता हूं। और यकीन है कि, मैं सिर्फ एक close
सही उस मामले में return
से पहले चिंता करने की है, तो मेरे पास है बिना जोड़ सकते हैं ...
लेकिन यह कैसे मैं हमेशा सही तरीके से बंद कर सकता डीबी कि return
, या एक raise
, या continue
, या बीच में जो भी हो? मैं एक कोड ब्लॉक की तरह कुछ में सोच रहा हूँ, इसी तरह try
उपयोग करने के लिए, निम्न सुझाव देते हैं, जो स्पष्ट रूप से काम नहीं करता है में की तरह:
def do_something_that_needs_database():
dbConnection = MySQLdb.connect(host=args['database_host'], user=args['database_user'], passwd=args['database_pass'], db=args['database_tabl'], cursorclass=MySQLdb.cursors.DictCursor)
try:
dbCursor = dbConnection.cursor()
dbCursor.execute('SELECT COUNT(*) total FROM table')
row = dbCursor.fetchone()
if row['total'] == 0:
print 'error: table have no records'
dbCursor.execute('UPDATE table SET field="%s"', whatever_value)
return None
print 'table is ok'
dbCursor.execute('UPDATE table SET field="%s"', another_value)
# again, that same lot of line codes done here
except ExitingCodeBlock:
closeDb(dbConnection)
# still, that "even more stuff" from before would come below
मुझे नहीं लगता कि वहाँ एक अपवाद के लिए ExitingCodeBlock
के लिए इसी तरह कुछ भी है , यद्यपि मैं जानता हूँ कि वहाँ else
कोशिश, लेकिन मुझे आशा है कि अजगर पहले से ही एक समान सुविधा है ...
या हो सकता है किसी ने मुझे एक प्रतिमान चाल कर सकते हैं सुझाव और मुझे बताओ कि इस भयंकर है और अत्यधिक की सलाह मुझे ऐसा कभी नहीं करने के लिए उस। हो सकता है कि यह चिंता करने के लिए कुछ है और MySQLdb इसे संभालने दें, या है ना?
ओह ठीक नहीं है, आपके और माइकल ने आपके उत्तरों को संपादित करने के बाद हमारे पास 2 बहुत समान और पूर्ण ... को चुनना मुश्किल है। – cregox