InterfaceError (0; '')

Я создал сайт с помощью Django и получаю эту досадную ошибку, когда пытаюсь выполнить запрос.

Если я перезапущу сервер Apache, ошибка исчезнет на короткое время.

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

person Marian    schedule 11.07.2011    source источник
comment
Не забудьте согласиться, если приведенные ниже решения работают для вас.   -  person Sofia Bravo    schedule 09.06.2015


Ответы (10)


Это вызвано глобальным курсором. Попробуйте создать и закрыть курсор в каждом методе, в котором требуется необработанный запрос.

cursor = connection.cursor()
cursor.execute(query)
cursor.close()
person scum    schedule 03.09.2011
comment
Что не так с глобальным курсором? У меня проблема, и я пытаюсь понять, что происходит. - person xitrium; 27.10.2011
comment
Нет ничего плохого в глобальном курсоре. Это просто причина этой конкретной проблемы. Я так и не смог понять, что происходит. Поскольку это непоследовательная ошибка, я предполагаю, что это ошибка MySQL-python. - person scum; 29.06.2016
comment
Посмотрите на ответ Моберга ниже - в моем случае это была правильная причина. - person davalo; 04.09.2016
comment
Я использую локальный курсор и все еще сталкиваюсь с проблемой, может ли кто-нибудь помочь? - person Bhargav; 13.12.2017

Вы получаете эту ошибку, когда у вас есть вызов db.close(), а затем вы пытаетесь получить доступ к базе данных без создания нового соединения. Попытайтесь выяснить, закрываете ли вы соединение с базой данных, когда вы этого не хотите.

person Moberg    schedule 15.01.2015
comment
это можно сделать, проверив: if( not db_handle.open): db_handle = MySQLdb.connect(**login_data) - person hardmooth; 18.08.2015
comment
Лично я не уверен, что это проблема, по крайней мере, в моем случае. В моих скриптах на Python не было .close(). Однако я получал эту ошибку каждый раз, когда перезапускал свой локальный сервер утром (после закрытия вечером накануне). Единственное, что у меня было в моих скриптах на Python, - это глобальный курсор, а не локальный курсор для каждой функции, которая обращается к моей базе данных. Так что я больше поддерживаю @scrum и его ответ ... - person Outcast; 15.06.2018
comment
@Poete_Maudit: Это определенно тот случай, когда вы можете получить это исключение, как описано. Возможно, есть другие способы вызвать такое же исключение. - person Moberg; 19.06.2018

Я согласился с Мобергом. Эта ошибка возникает, когда мы пытаемся получить доступ к базе данных после закрытия соединения. Это могло быть вызвано неправильным отступом в коде. Ниже мой код.

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()

Я получил ту же ошибку, что и Мэриан. После удаления conn.close () все работало хорошо. Подтверждено, что глобальное соединение не является проблемой.

person Toàn Nguyễn    schedule 05.01.2016

У меня была та же проблема, что и в апреле 2019 года, с использованием python 3.7 и Mysql 2.7.

Через определенные промежутки времени к моим операторам SQL случайным образом добавлялась строка (0, ''), что приводило к ошибкам. Я решил проблему, прокомментировав закрытие соединения с базой данных и просто оставив закрытие курсоров в моем коде.

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

...

person FelipeGTX    schedule 04.04.2019

Я могу подтвердить, что это вызвано глобальным курсором, который затем используется в некоторых функциях. Мои симптомы были такими же: периодически возникающие ошибки интерфейса, которые временно устранялись перезапуском apache.

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

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

Но я использую Django поверх Oracle 11.2, поэтому я не считаю, что это ошибка в драйвере MySQL / python. Вероятно, это связано с кешированием, выполняемым apache / mod_wsgi.

person Patrick    schedule 28.06.2012
comment
Это не специфично для Django. У меня проблема с Cherrypy, работающим за apache на bluehost, а также с Cherrypy за nginx, работающим на webfaction. Это проблема mysql-python, которую я могу исправить, закрывая курсор каждый раз после загрузки. У меня тоже периодически возникали ошибки. - person Marc Maxmeister; 10.11.2012

У меня была такая же проблема с использованием потоковой передачи с Python3 и Pymysql. У меня возникали тупиковые ситуации, а затем я получал InterfaceError (0, '').

Моя проблема заключалась в том, что я пытался выполнить откат при исключении запроса - я считаю, что этот откат пытался использовать соединение, которого больше не существовало, и он давал мне ошибку интерфейса. Я отказался от этого отката (потому что я не против не выполнять откат для этого запроса) и просто отпустил его. Это устранило мою проблему.

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
person Philip Plachta    schedule 09.03.2021

У меня была такая же проблема с Flask + pymysql, я получал пустой кортеж в результате в блоке except:, что-то вроде этого "(\"(0, '')\",)", чтобы быть конкретным.

Оказалось, что соединение закрывалось, и позже код попытался получить к нему доступ, что привело к этой ошибке. Поэтому я решил это, обратившись к приведенным выше решениям, и использовал функцию для подключения, которая гарантировала мне conn каждый раз, когда мне приходилось обращаться к базе данных.

Вы можете воссоздать эту проблему, вставив conn.close() непосредственно перед доступом к cursor.

Для справки я использовал этот сайт, который помог мне решить эту проблему.

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

person Sagar Wankhede    schedule 31.05.2020

Для меня удаление conn.close() из моей функции сработало. После закрытия я снова пытался получить доступ к базе данных. Я использую колбу с AWS. Также вы можете попробовать перезапустить приложение фляги, если оно работает в течение длительного времени, и если вы также используете AWS RDS с рабочей средой MYSQL, как в моем случае, тогда просто проверьте, истек ли срок вашего сеанса, и обновите ключ доступа и я бы.

Надеюсь это поможет.

person aniketwattamwar    schedule 24.06.2020

У меня была такая же проблема, и в Django у меня сработало то, что описано в этом ответе, который состоит из:

Замена

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

с участием

'ENGINE': 'mysql_server_has_gone_away'

on

settings.DATABASES['ENGINE']

и установка с помощью pip пакета ниже:

mysql_server_has_gone_away==1.0.0
person Ruben Alves    schedule 10.06.2021

person    schedule
comment
Этот ответ был отмечен как некачественный, потому что это всего лишь код без объяснения причин. Было бы здорово, если бы вы могли объяснить почему использование диспетчера контекста решает проблему. - person Gino Mempin; 25.02.2021