Wie kann ich MySQL-Client automatisch mit MySQLdb verbinden?

Ich kam auf PHP Weg, um den Trick zu tun:

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

Aber kein Glück mit MySQLdb (python-mysql).

Kann jemand bitte einen Hinweis geben? Vielen Dank.

7 Solutions collect form web for “Wie kann ich MySQL-Client automatisch mit MySQLdb verbinden?”

Ich habe dieses Problem gelöst, indem ich eine Funktion cursor.execute() , die die Methode cursor.execute() verpackt, da das, was die MySQLdb.OperationalError Ausnahme warf, Das andere Beispiel oben bedeutet, dass es die Methode conn.cursor() ist, die diese Ausnahme 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 

Ich hatte Probleme mit der vorgeschlagenen Lösung, weil es nicht die Ausnahme fing. Ich bin mir nicht sicher, warum.

Ich habe das Problem mit der ping(True) -Anweisung gelöst, die meiner Meinung nach neater ist:

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

Erhalten Sie es von hier: http://www.neotitans.com/resources/python/mysql-python-connection-error-2006.html

Wenn Sie Ubuntu Linux verwenden, wurde ein Patch hinzugefügt, der dem python-mysql-Paket hinzugefügt wurde, das die Möglichkeit hinzugefügt hat, diese MYSQL_OPT_RECONNECT-Option einzustellen (siehe hier ). Ich habe es aber nicht ausprobiert

Leider wurde der Patch später aufgrund eines Konflikts mit Autoconnect und Transformation ( hier beschrieben) entfernt.

Die Kommentare von dieser Seite sagen: 1.2.2-7 Veröffentlicht in intrepid-release am 2008-06-19

Python-mysqldb (1.2.2-7) instabil; Dringlichkeit = niedrig

[Sandro Tosi] * debian / control – list Artikel Zeilen in Beschreibung beginnt mit 2 Platz, um zu vermeiden, um auf Webseiten zu formatieren (Closes: # 480341)

[Bernd Zeimetz] * debian / patches / 02_reconnect.dpatch: – Dropping Patch: Kommentar in Storm, der das Problem erklärt:

  # 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. 

Sie können das Commit und das Schließen für die Verbindung trennen … das ist nicht süß, aber es tut es.

 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() 

Ich hatte ein ähnliches Problem mit MySQL und Python, und die Lösung, die für mich arbeitete, war, MySQL auf 5.0.27 zu aktualisieren (auf Fedora Core 6, Ihr System kann mit einer anderen Version gut funktionieren).

Ich habe versucht, eine Menge anderer Dinge, einschließlich Patching der Python-Bibliotheken, aber das Upgrade der Datenbank war viel einfacher und (ich denke) eine bessere Entscheidung.

Verwenden Sie die Methode is_connected , die Überprüfung auf OperationalError ist zu generisch, es sei denn, Sie überprüfen die is_connected , da ein OperationalError aus anderen Gründen angehoben werden kann.

 def is_connected(self): """Reports whether the connection to MySQL Server is available This method checks whether the connection to MySQL is available. It is similar to ping(), but unlike the ping()-method, either True or False is returned and no exception is raised. Returns True or False. """ try: self.cmd_ping() except: return False # This method does not raise return True 

Beispiel:

 class App: db_config = { 'host' : 'localhost', 'user' : 'example_user', 'password' : 'example_pass', 'database' : 'example_db', 'autocommit': True } dbc = None def getDBC(): if self.dbc is None: try: self.dbc = mysql.connector.connect(**self.db_config) return self.dbc except mysql.connector.Error as err: if err.errno == mysql.connector.errorcode.ER_ACCESS_DENIED_ERROR: print("Database access denied") elif err.errno == mysql.connector.errorcode.ER_BAD_DB_ERROR: print("Database does not exist") else: print(err) if not self.dbc.is_connected(): self.dbc.connect(**self.db_config) return self.dbc app = App() cursor = app.getDBC().cursor() 

Offensichtlich, wenn Sie den Cursor um zu lange halten, wird es immer noch scheitern, wenn das ein Problem ist, das Sie benötigen, um Ihre Anwendung neu zu gestalten, sollten Cursor nicht länger gehalten werden, dann wirklich erforderlich und eine Trennung wird alle Ressourcen, die der Cursor beabsichtigt, ungültig machen Referenz in MySQL, die zuvor eingerichtet wurde.

Zum Beispiel wäre das schlecht

 cursor = app.getDBC().cursor() cursor.execute("BEGIN") // wait a long time, detect failure and reconnect try: cursor.execute("DELETE FROM x") cursor.execute("SOME BAD QUERY") except: cusror.execute("ROLLBACK") 

Der Rollback wird fehlschlagen, weil die Transaktion beendet wurde, wenn die Verbindung zur Datenbank verloren ging. Oder einige vorherige Operationen werden automatisch zurückgesetzt wegen des Verlustes der Verbindung, die Ihre Datenbank in einem inkonsistenten Zustand verlässt.

Sie andere wette, es zu arbeiten um fallen gelassen Verbindungen selbst mit Code.

Eine Möglichkeit, es zu tun, wäre folgendes:

 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 
  • Alembic mit SQLAlchemy integrieren
  • Duplikat Unicode Eintrag Fehler auf der einzigartigen Spalte - mysql [duplicate]
  • Mysql Fehler aus Macports: vermisst mysqld.sock
  • Hat pyodbc irgendeine Form von benannten Parametern unterstützt?
  • Python 5x langsamer als perl mySql query
  • Umgang mit Daten vor 1970 in einer wiederholbaren Weise in MySQL und Python
  • Wie installiere und verwende ich MySQLdb für Python 3 unter Windows 10?
  • SQLAlchemy StaleDataError beim Löschen von über ORM eingefügten Elementen sqlalchemy.orm.exc.StaleDataError
  • Löschen Sie mehrere Zeilen in MYSQL mit Info aus der Python-Liste
  • Möchten Sie ein Bild anzeigen
  • SQLAlchemy klassischer Mapper "konnte keine Primärschlüsselspalten für abgebildete Tabelle zusammenstellen" trotz Anwesenheit eines Primärschlüssels?
  • Python ist die beste Programmiersprache der Welt.