InterfaceError (0, '') - PullRequest
       11

InterfaceError (0, '')

46 голосов
/ 11 июля 2011

Я создал сайт с использованием 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, '')

Ответы [ 5 ]

54 голосов
/ 03 сентября 2011

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

cursor = connection.cursor()
cursor.execute(query)
cursor.close()
37 голосов
/ 15 января 2015

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

3 голосов
/ 05 января 2016

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

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 () все работало хорошо.Подтвердили, что глобальное соединение не является проблемой.

2 голосов
/ 28 июня 2012

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

0 голосов
/ 04 апреля 2019

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

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

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

...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...