63 votes

InterfaceError (0, '')

J'ai construit un site en utilisant Django et je reçois cette erreur ennuyeuse lorsque j'essaie d'exécuter une requête.

Si je redémarre le serveur Apache, l'erreur disparaît pendant un court instant.

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 Points 1511

Ceci est dû à un curseur global. Essayez de créer et de fermer le curseur dans chaque méthode où une requête brute est nécessaire.

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

53voto

Moberg Points 658

Vous obtenez cette erreur lorsque vous avez un db.close() et essayez ensuite d'accéder à la base de données sans créer de nouvelle connexion. Essayez de trouver si vous fermez la connexion à la base de données alors que vous ne le voulez pas.

5voto

Toàn Nguyễn Points 351

Je suis d'accord avec Moberg. Cette erreur est provoquée lorsque nous essayons d'accéder à la base de données après avoir fermé la connexion. Cela pourrait être causé par une mauvaise indentation dans le code. Voici mon 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()

J'ai obtenu la même erreur que celle signalée par Marian. Après avoir dédenté conn.close(), tout a bien fonctionné. Je confirme que la connexion globale n'est pas un problème.

3voto

FelipeGTX Points 53

J'ai eu le même problème que pour avril 2019 en utilisant python 3.7 et Mysql 2.7.

À des intervalles intermittents, la chaîne (0, '') était ajoutée de manière aléatoire à mes instructions SQL, ce qui provoquait des erreurs. J'ai résolu le problème en commentant la fermeture de la connexion à la base de données et en laissant la fermeture des curseurs dans mon code.

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

...

3voto

Patrick Points 91

Je peux confirmer que cela est causé par un curseur global qui est ensuite utilisé dans certaines fonctions. Mes symptômes étaient exactement les mêmes : des erreurs d'interface intermittentes qui étaient temporairement résolues par un redémarrage d'Apache.

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

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

Mais j'utilise Django au-dessus d'Oracle 11.2 et je ne pense pas qu'il s'agisse d'un bogue dans le pilote MySQL/python. Cela est probablement dû à la mise en cache effectuée par apache/mod_wsgi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X