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, '')

77voto

scum Punkte 3102

Dies wird durch einen globalen Cursor verursacht. Versuchen Sie, den Cursor in jeder Methode, für die eine Rohabfrage benötigt wird, zu erstellen und zu schließen.

cursor = connection.cursor()
cursor.execute(query)
cursor.close()

53voto

Moberg Punkte 4919

Sie erhalten diesen Fehler, wenn Sie eine db.close() aufrufen und später versuchen, auf die Datenbank zuzugreifen, ohne eine neue Verbindung herzustellen. Versuchen Sie herauszufinden, ob Sie die Verbindung zur Datenbank schließen, obwohl Sie dies nicht beabsichtigen.

5voto

Toàn Nguyễn Punkte 361

Ich stimme mit Moberg überein. Dieser Fehler wird verursacht, wenn wir versuchen, auf die Datenbank zuzugreifen, nachdem wir die Verbindung geschlossen haben. Dies könnte durch eine falsche Einrückung im Code verursacht werden. Unten ist mein Code.

conn = connect()
cur = conn.cursor()
tk = get_tickers(cur)
for t in tk:
    prices = read_price(t, cur)
    if prices != None:
        update_price(t, cur)
        print 'Price after update of ticker ', t, ':'
        p_open, p_high, p_low, p_close = read_price(t, cur)
        print p_open, p_high, p_low, p_close
    else:
        print 'Price for ', t, ' is not available'
    conn.close()

Ich habe den gleichen Fehler wie Marian. Nachdem ich conn.close() dedentiert hatte, funktionierte alles gut. Es wurde bestätigt, dass die globale Verbindung kein Problem darstellt.

3voto

Patrick Punkte 121

Ich kann bestätigen, dass dies durch einen globalen Cursor verursacht wird, der dann später in einigen Funktionen verwendet wird. Meine Symptome waren genau die gleichen: intermittierende Schnittstellenfehler, die vorübergehend durch einen Apache-Neustart behoben wurden.

from django.db import connection
cursor = connection.cursor() # BAD

def foo():
    cursor.execute('select * from bar')

Aber ich verwende Django auf Oracle 11.2, also glaube ich nicht, dass dies ein Fehler im MySQL/Python-Treiber ist. Dies ist wahrscheinlich aufgrund der Zwischenspeicherung von apache/mod_wsgi getan.

3voto

FelipeGTX Punkte 81

Ich hatte das gleiche Problem wie im April 2019 mit python 3.7 und Mysql 2.7.

In unregelmäßigen Abständen wurde die Zeichenfolge (0, '') zufällig zu meinen SQL-Anweisungen hinzugefügt, was zu Fehlern führte. Ich habe das Problem gelöst, indem ich das Schließen der Datenbankverbindung auskommentiert und nur das Schließen der Cursor in meinem Code belassen habe.

def set_db():
    db = pymysql.connect(host='localhost',
                         user="root",
                         passwd="root",
                         db="DATABASE")
    return db

def execute_sql(cnx, sql_clause, fetch_all):

    if sql_clause and sql_clause is not None:
        try:
            cnx.execute(sql_clause)
        except Exception as e:
            print("Error in sql: " + sql_clause + str(e))
            return 0
            pass

        if fetch_all:
            result = cnx.fetchall()
        else:
            result = cnx.fetchone()

        return result
    else:
        print("Empty sql.")
        return 0

db = set_db()
cnx = db.cursor()
sql = "SELECT * FROM TABLE"
result = execute_sql(cnx, sql, 1)
cnx.close() #close the cursor
#db.close #do not close the db connection

...

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