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îtra pendant une courte période.

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, '')
37
demandé sur Marian 2011-07-11 17:38:28

4 réponses

Ceci est causé par un curseur. Essayez de créer et de fermer le curseur dans chaque méthode, une requête brute est nécessaire.

cursor = connection.cursor()
cursor.execute(query)
cursor.close()
48
répondu scum 2015-06-10 16:57:20

Vous obtenez cette erreur lorsque vous avez un appel db.close() et que vous essayez plus tard 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 lorsque vous ne veux pas.

28
répondu Moberg 2016-10-03 08:39:06

Je peux confirmer que ceci 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 seraient temporairement effacées 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 donc je ne crois pas que ce soit un bug dans le pilote MySQL/python. Ceci est probablement dû à la mise en cache effectuée par apache/mod_wsgi.

2
répondu Patrick 2012-06-28 14:12:05

J'étais 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 indentation incorrecte dans le code. Ci-dessous 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 eu la même erreur que celle rapportée par Marian. Après avoir dépoussiéré conn.close(), tout a bien fonctionné. Confirmé que Global conn n'est pas un problème.

2
répondu Toàn Nguyễn 2016-01-05 06:50:44