web-dev-qa-db-fra.com

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

Cela est dû à un curseur global. 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()
59
scum

Vous obtenez cette erreur lorsque vous avez un appel db.close() et essayez ultérieurement d'accéder à la base de données sans créer de nouvelle connexion. Essayez de savoir si vous fermez la connexion à la base de données lorsque vous ne le souhaitez pas.

40
Moberg

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 peut être dû à une indentation incorrecte 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 eu la même erreur que celle rapportée par Marian. Après avoir dédenté conn.close (), tout a bien fonctionné. Confirmé que la connexion globale n'est pas un problème.

3
Toàn Nguyễn

Je peux confirmer que cela est causé par un curseur global qui est ensuite utilisé plus tard dans certaines fonctions. Mes symptômes étaient exactement les mêmes: des erreurs d'interface intermittentes qui seraient temporairement éliminé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 en plus d'Oracle 11.2 donc je ne pense 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
Patrick

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

À intervalles intermittents, la chaîne (0, '') serait ajoutée au hasard à mes instructions SQL, ce qui provoquerait des erreurs. J'ai résolu le problème en commentant la fermeture de la connexion à la base de données et en laissant simplement 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

...

1
FelipeGTX