63 Stimmen

InterfaceError (0, '')

Ich habe eine Website mit Django gebaut und ich erhalte diese lästige Fehler, wenn ich versuche, eine Abfrage auszuführen.

Wenn ich den Apache-Server neu starte, verschwindet der Fehler für eine kurze Zeit.

Traceback:
File "/usr/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
100.                     response = callback(request, *callback_args, **callback_kwargs)
File "/home/fran/cron/views/set_caches.py" in set_caches
24.         cursor.execute(query, [category['id']])
File "/usr/local/lib/python2.7/site-packages/django/db/backends/util.py" in execute
15.             return self.cursor.execute(sql, params)
File "/usr/local/lib/python2.7/site-packages/django/db/backends/mysql/base.py" in execute
86.             return self.cursor.execute(query, args)
File "build/bdist.linux-i686/egg/MySQLdb/cursors.py" in execute
155.         charset = db.character_set_name()

Exception Type: InterfaceError at /blablabla/
Exception Value: (0, '')

3voto

Philip Plachta Punkte 81

Ich hatte das gleiche Problem mit Threading mit Python3 und Pymysql. Ich war immer Deadlocks und dann würde ich mit InterfaceError (0, '') getroffen werden.

Mein Problem war, dass ich versuchte, ein Rollback auf Ausnahme der Abfrage zu tun - ich glaube, dieses Rollback versuchte, eine Verbindung zu verwenden, die nicht mehr existierte, und es gab mir den Schnittstellenfehler. Ich habe dieses Rollback herausgenommen (weil es mir nichts ausmacht, für diese Abfrage kein Rollback durchzuführen) und die Dinge einfach laufen lassen. Damit war mein Problem behoben.

def delete_q_msg(self, assetid, queuemsgtypeid, msgid):
    """
    Given the paramerts below remove items from the msg queue equal to or older than this.
    If appropriate send them into a history table to be processed later

    :param assetid:
    :param queuemsgtypeid:
    :param msgid:
    :return:
    """
    params = (assetid, queuemsgtypeid, msgid,)
    db_connection = self._connect_to_db()
    sp_sql = "{db}.ps_delete_q_msg".format(db=self._db_settings["database"])
    return_value = []
    try:
        with db_connection.cursor() as cursor:
            cursor.callproc(sp_sql, params)
            return_value = cursor.fetchall()
        db_connection.commit()
    except Exception as ex:
        # i think we dont want rollback here
        # db_connection.rollback()
        raise Exception(ex)
    finally:
        db_connection.close()

    return return_value

0voto

Sagar Wankhede Punkte 212

Ich hatte das gleiche Problem mit Flask+pymysql, ich war immer ein leeres Tupel als Ergebnis in der except: Block, etwa so "(\"(0, '')\",)" um genau zu sein.

Es stellte sich heraus, dass die Verbindung geschlossen wurde und der Code später versuchte, auf sie zuzugreifen, was zu diesem Fehler führte. Also löste ich das Problem, indem ich mich auf die oben genannten Lösungen bezog und eine Funktion für die Verbindung verwendete, die mir eine conn jedes Mal, wenn ich auf die Datenbank zugreifen musste.

Sie können dieses Problem nachstellen, indem Sie Folgendes einfügen conn.close() kurz vor dem Zugriff auf die cursor .

Als Referenz habe ich diese Website verwendet, die mir geholfen hat, dieses Problem zu lösen.

https://hackersandslackers.com/python-mysql-pymysql/

0voto

aniketwattamwar Punkte 21

Für mich ist das Entfernen der conn.close() aus meiner Funktion funktioniert. Ich habe versucht, nach dem Schließen wieder auf die Datenbank zuzugreifen. Ich verwende Flask mit AWS. Sie können auch versuchen, Ihre Flask-Anwendung neu zu starten, wenn sie schon lange läuft. Wenn Sie auch AWS RDS mit MYSQL Workbench verwenden, wie in meinem Fall, dann prüfen Sie einfach, ob Ihre Sitzung abgelaufen ist oder nicht, und aktualisieren Sie den Zugangsschlüssel und die ID.

Ich hoffe, das hilft.

0voto

Ruben Alves Punkte 116

Ich hatte das gleiche Problem und was für mich in Django funktionierte, war, was in beschrieben wird diese Antwort die aus folgenden Elementen besteht:

Ersetzen von

'ENGINE': 'django.db.backends.mysql'

mit

'ENGINE': 'mysql_server_has_gone_away'

auf

settings.DATABASES['ENGINE']

und installieren Sie mit pip das untenstehende Paket:

mysql_server_has_gone_away==1.0.0

-1voto

xin.chen Punkte 758
with connections.cursor() as cursor:
    res=cursor.execute(sql)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X