2008-10-16 11 views
31

मैं चाल करने का पीएचपी तरह से भर में आया था:MySQL क्लाइंट ऑटो MySQLdb से पुनः कनेक्ट करने में सक्षम कैसे करें?

my_bool reconnect = 1; 
mysql_options(&mysql, MYSQL_OPT_RECONNECT, &reconnect); 

लेकिन MySQLdb के साथ कोई भाग्य (अजगर-mysql)।

क्या कोई कृपया एक सुराग दे सकता है? धन्यवाद।

उत्तर

8

यदि आप उबंटू लिनक्स का उपयोग कर रहे हैं तो पाइथन-माइस्क्ल पैकेज में एक पैच जोड़ा गया था जिसमें उसी MYSQL_OPT_RECONNECT विकल्प को सेट करने की क्षमता शामिल थी (here देखें)। मैंने हालांकि कोशिश नहीं की है।

दुर्भाग्यवश, पैच को बाद में ऑटोकनेक्ट और ट्रांसलेशन के साथ एक संघर्ष के कारण हटा दिया गया था (वर्णित here)।

उस पृष्ठ से टिप्पणी कहते हैं: 1.2.2-7 2008-06-19

अजगर-mysqldb (1.2.2-7) अस्थिर पर निडर रिलीज में प्रकाशित; तात्कालिकता = कम

[सैंड्रो टोसी] * Debian/नियंत्रण - विवरण में सूची आइटम लाइनों, 2 अंतरिक्ष के साथ शुरू होता वेबपेजों पर पुनः स्वरूपित (बंद कर देता है: # 480,341) से बचने के लिए

[बर्न्ड Zeimetz] * Debian/पैच/02_reconnect.dpatch: - पैच गिराने: तूफान में टिप्पणी जो समस्या बताते हैं:

# Here is another sad story about bad transactional behavior. MySQL 
    # offers a feature to automatically reconnect dropped connections. 
    # What sounds like a dream, is actually a nightmare for anyone who 
    # is dealing with transactions. When a reconnection happens, the 
    # currently running transaction is transparently rolled back, and 
    # everything that was being done is lost, without notice. Not only 
    # that, but the connection may be put back in AUTOCOMMIT mode, even 
    # when that's not the default MySQLdb behavior. The MySQL developers 
    # quickly understood that this is a terrible idea, and removed the 
    # behavior in MySQL 5.0.3. Unfortunately, Debian and Ubuntu still 
    # have a patch right now which *reenables* that behavior by default 
    # even past version 5.0.3. 
+0

मुझे लगता है कि जो कुछ भी ग्राहक है, एक खो कनेक्शन एक के नुकसान का संकेत हो सकता लेनदेन (सर्वर पावर साइकल) या कनेक्टिविटी का नुकसान। इसलिए मैं मानता हूं कि सरल पुनः कनेक्टिंग MySQL क्लाइंट उपयोगकर्ता की अपेक्षा के विरुद्ध डेटा की हानि को छुपा सकता है। –

-3

आप अन्य शर्त यह हल करने के लिए कनेक्शन अपने आप कोड के साथ गिरा दिया।

एक तरह से करने के लिए यह होगा निम्नलिखित:

import MySQLdb 

class DB: 
    conn = None 

    def connect(self): 
     self.conn = MySQLdb.connect() 

    def cursor(self): 
     try: 
      return self.conn.cursor() 
     except (AttributeError, MySQLdb.OperationalError): 
      self.connect() 
      return self.conn.cursor() 

db = DB() 
cur = db.cursor() 
# wait a long time for the Mysql connection to timeout 
cur = db.cursor() 
# still works 
+4

वास्तव में यह काम नहीं करता है। एक कर्सर बनाना डीबी के साथ कनेक्शन नहीं बनाता है और इसलिए ऑपरेशन एरर अपवाद फेंक नहीं देता है। – Boaz

1

मैं MySQL और अजगर, और समाधान है कि मेरे लिए काम किया के साथ एक समान समस्या थी (5.0.27 लिए MySQL के उन्नयन के लिए फेडोरा कोर पर था 6; आपका सिस्टम एक अलग संस्करण के साथ ठीक काम कर सकता है)।

मैंने पाइथन पुस्तकालयों को पैच करने सहित कई अन्य चीजों की कोशिश की, लेकिन डेटाबेस को अपग्रेड करना बहुत आसान था और (मुझे लगता है) एक बेहतर निर्णय था।

65

मैंने cursor.execute() विधि को लपेटने के लिए इस समस्या को हल किया है, जो MySQLdb.OperationalError अपवाद को फेंक रहा था। उपरोक्त अन्य उदाहरण का तात्पर्य है कि यह conn.cursor() विधि है जो इस अपवाद को फेंकता है।

import MySQLdb 

class DB: 
    conn = None 

    def connect(self): 
    self.conn = MySQLdb.connect() 

    def query(self, sql): 
    try: 
     cursor = self.conn.cursor() 
     cursor.execute(sql) 
    except (AttributeError, MySQLdb.OperationalError): 
     self.connect() 
     cursor = self.conn.cursor() 
     cursor.execute(sql) 
    return cursor 

db = DB() 
sql = "SELECT * FROM foo" 
cur = db.query(sql) 
# wait a long time for the Mysql connection to timeout 
cur = db.query(sql) 
# still works 
+0

अच्छा ... अच्छा जवाब !! –

+1

@ garret-heaton - AttributeError पर फिर से कनेक्ट क्यों करें? जब कनेक्शन खराब हो जाता है तो क्या वह फेंक दिया जाता है? – aaa90210

+0

काफी समय के लिए मैंने अपने रैपर में कभी-कभी mysql त्रुटियों को समझने की कोशिश की। शुरू में मैंने सोचा था कि 'conn.open' चाल नहीं करेगा ... लेकिन यह काम किया। –

3

आप कनेक्शन के लिए प्रतिबद्ध और बंद को अलग कर सकते हैं ... यह प्यारा नहीं है लेकिन यह करता है।

class SqlManager(object): 
""" 
Class that handle the database operation 
""" 
def __init__(self,server, database, username, pswd): 

     self.server = server 
     self.dataBase = database 
     self.userID = username 
     self.password = pswd 

def Close_Transation(self): 
     """ 
     Commit the SQL Query 
     """ 
     try: 
     self.conn.commit() 
     except Sql.Error, e: 
     print "-- reading SQL Error %d: %s" % (e.args[0], e.args[1]) 

def Close_db(self): 
    try: 
     self.conn.close() 
    except Sql.Error, e: 
     print "-- reading SQL Error %d: %s" % (e.args[0], e.args[1]) 

def __del__(self): 
    print "close connection with database.." 
    self.conn.close() 
12

मुझे प्रस्तावित समाधान के साथ समस्याएं थीं क्योंकि इसे अपवाद नहीं मिला था। मुझे यकीन नहीं है क्यों।

मैं ping(True) बयान जो मुझे लगता है के साथ समस्या का समाधान कर लिया neater है:

import MySQLdb 
con=MySQLdb.Connect() 
con.ping(True) 
cur=con.cursor() 

इसे यहाँ से समझे: http://www.neotitans.com/resources/python/mysql-python-connection-error-2006.html

+1

मैं अपनी स्क्रिप्ट को 16-20 उपप्रोसेसेस में घुमा रहा था, और मुझे mysql के साथ समस्याएं हो रही थीं। Con.ping (सच) मेरी समस्या तय की। धन्यवाद। – HussoM

+4

क्वेरी चलाने से पहले पिंगिंग को एंटी-पैटर्न माना जाता है जो संसाधनों को बर्बाद करता है और अविश्वसनीय है: https://www.percona.com/blog/2010/05/05/checking-for-a-live-database-connection- पर विचार किया गया -नुकसान पहुचने वाला/ –

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

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