Ответ 1
Это вызвано глобальным курсором. Попробуйте создать и закрыть курсор внутри каждого метода, требуется необработанный запрос.
cursor = connection.cursor()
cursor.execute(query)
cursor.close()
Я создал сайт с использованием 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, '')
Это вызвано глобальным курсором. Попробуйте создать и закрыть курсор внутри каждого метода, требуется необработанный запрос.
cursor = connection.cursor()
cursor.execute(query)
cursor.close()
Вы получаете эту ошибку, если у вас есть вызов db.close()
, а затем попытайтесь получить доступ к базе данных без создания нового соединения. Попробуйте найти, если вы закрываете соединение с базой данных, когда вы этого не хотите.
Я согласился с Мобергом. Эта ошибка возникает, когда мы пытаемся получить доступ к базе данных после того, как мы закрыли соединение. Это может быть вызвано неправильным отступом в коде. Ниже мой код.
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()
Я получил ту же ошибку, о которой сообщил Мариан. После того, как dedenting conn.close(), все работало хорошо. Подтверждено, что глобальное соединение не является проблемой.
Я могу подтвердить, что это вызвано глобальным курсором, который впоследствии используется в некоторых функциях. Мои симптомы были такими же: прерывистые ошибки интерфейса, которые будут временно очищены перезапуском 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.
У меня была та же проблема, что и в апреле 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
...