2012-09-11 14 views
6

क्या उनके बीच कनेक्शन बंद किए बिना एकाधिक लेनदेन के लिए एक एकल MySQLdb कनेक्शन का उपयोग करना ठीक है? दूसरे शब्दों में, इस तरह कुछ:MySQLdb प्रति कनेक्शन एकाधिक लेनदेन के साथ

conn = MySQLdb.connect(host="1.2.3.4", port=1234, user="root", passwd="x", db="test") 

for i in range(10): 
    try: 
     cur = conn.cursor() 
     query = "DELETE FROM SomeTable WHERE ID = %d" % i 
     cur.execute(query) 
     cur.close() 
     conn.commit() 

    except Exception: 
     conn.rollback() 

conn.close() 

ऐसा लगता है ठीक है, लेकिन मैं सिर्फ दो बार जांचना चाहता था।

+0

बहुत बुरा आपने अपनी गलती नहीं छोड़ी। संशोधनों को पढ़ने से पहले मैं वास्तव में उलझन में आया क्योंकि मुझे नहीं पता था कि मार्टिजन पीटर किस बारे में बात कर रहे थे। –

उत्तर

15

मुझे लगता है कि यहां एक लेनदेन का गठन करने के बारे में एक गलतफहमी है।

आपका उदाहरण एक कनेक्शन खोलता है, फिर एक लेनदेन निष्पादित करता है। आप उस लेनदेन में कई SQL कथन निष्पादित करते हैं, लेकिन आप इसे करने के बाद पूरी तरह बंद कर देते हैं। बेशक यह ठीक से ज्यादा है।

निष्पादित कई लेनदेन (बस SQL ​​कथन के विपरीत), इस तरह दिखता है:

conn = MySQLdb.connect(host="1.2.3.4", port=1234, user="root", passwd="x", db="test") 

for j in range(10): 
    try: 
     for i in range(10): 
      cur = conn.cursor() 
      query = "DELETE FROM SomeTable WHERE ID = %d" % i 
      cur.execute(query) 
      cur.close() 
     conn.commit() 
    except Exception: 
     conn.rollback() 

conn.close() 

ऊपर कोड 10 लेनदेन करता है, प्रत्येक बयान को हटाने के 10 अलग-अलग होते हैं।

और हाँ, आप समस्याओं के बिना उस के लिए खुले कनेक्शन है, जब तक आप धागे के बीच कनेक्शन साझा नहीं करते हैं फिर से उपयोग करने के लिए सक्षम होना चाहिए।

उदाहरण के लिए, SQLAlchemy एप्लिकेशन को आवश्यकतानुसार खुले कनेक्शन को सौंपकर, उन्हें पूल करके कनेक्शन का पुन: उपयोग करता है। एप्लिकेशन के बंद होने तक बंद होने की आवश्यकता के बिना, इन कनेक्शनों पर नए लेन-देन और नए कथन निष्पादित किए जाते हैं।

+0

हाँ, आप सही हैं। मैंने इसे पोस्ट करने के लिए इसे नीचे पानी देने के दौरान अपना उदाहरण खराब कर दिया। मैं इसे ठीक कर दूंगा। – d512

+0

मेरे परिदृश्य के नीचे धागे के बीच कनेक्शन साझा करने में समस्या क्या होगी? – d512

+2

@ user1334007: [MySQLdb प्रलेखन] से (http://mysql-python.sourceforge.net/MySQLdb.html): * "आप दो धागे एक साथ एक कनेक्शन का उपयोग करते हैं, तो MySQL क्लाइंट लाइब्रेरी शायद upchuck और मर जाएगा। आपको चेतावनी दी गई है।"*। –

0

पहले एक क्वेरी स्ट्रिंग बनाने और फिर उस एकल MySQL कथन को निष्पादित करना बेहतर होगा। उदाहरण के लिए:

query = "DELETE FROM table_name WHERE id IN (" 
for i in range(10): 
    query = query + "'" + str(i) + "', " 
query = query[:-2] + ')' 

cur = conn.cursor() 
cur.execute(query) 
+0

यह अधिक कुशल है, लेकिन ऐसे कारण हैं कि मैं इसे इस तरह से क्यों नहीं कर रहा हूं। – d512

+0

ठीक है, बस जांच रहा है। –

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