我使用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, '')
答案 0 :(得分:53)
这是由全局光标引起的。尝试在需要原始查询的每个方法中创建和关闭游标。
cursor = connection.cursor()
cursor.execute(query)
cursor.close()
答案 1 :(得分:36)
当您进行db.close()
调用并稍后尝试访问数据库而不创建新连接时,会出现此错误。尝试查找是否在不打算关闭数据库的连接时关闭。
答案 2 :(得分:3)
我同意莫伯格。在我们关闭连接后尝试访问数据库时会导致此错误。这可能是由代码中的一些错误缩进引起的。以下是我的代码。
form {
margin: 0;
}
input,
select,
textarea {
background-color: #ffffff;
padding: 2px;
border-radius: 3px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
outline: none;
border: 3px solid #999999;
color: #333333;
font-size: 12px;
margin: 0px 10px 10px 0;
}
我得到了与玛丽安报道相同的错误。在dennting conn.close()之后,一切运行良好。确认全球conn不是问题。
答案 3 :(得分:2)
我可以确认这是由全局游标引起的,然后在某些函数中使用。我的症状完全相同:间歇性的接口错误,暂时被apache重启清除。
from django.db import connection
cursor = connection.cursor() # BAD
def foo():
cursor.execute('select * from bar')
但是,我在Oracle 11.2上使用Django所以我不相信这是MySQL / python驱动程序中的错误。这可能是由于apache / mod_wsgi完成了缓存。
答案 4 :(得分:2)
我在使用 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
答案 5 :(得分:0)
我使用python 3.7和Mysql 2.7遇到了与2019年4月相同的问题。
每隔一段时间,字符串(0,'')就会随机添加到我的SQL语句中,从而导致错误。我通过评论关闭数据库连接并仅在我的代码中保留游标的关闭来解决该问题。
constructor() {
console.log("a1");
this.config().then(_ =>
console.log("a2");
});
}
...
答案 6 :(得分:0)
我在Flask + pymysql中遇到了同样的问题,由于except:
块中出现了一个空元组,具体来说就是这样的"(\"(0, '')\",)"
。
原来,连接已关闭,后来代码尝试访问它,从而导致此错误。
因此,我通过参考上述解决方案解决了该问题,并使用了用于连接的函数,该函数可以确保每次访问数据库时都有conn
。
您可以在访问conn.close()
之前插入cursor
来重新创建此问题。
作为参考,我使用了这个站点,它帮助我解决了这个问题。
答案 7 :(得分:0)
对我来说,从函数中删除conn.close()
可以正常工作。关闭后,我试图再次访问数据库。
我正在将Flask与AWS结合使用。
如果您的烧瓶应用程序已经运行了很长时间,并且您也像我的案例一样使用了带有MYSQL工作台的AWS RDS,也可以尝试重新启动烧瓶应用程序,然后只需检查您的会话是否已过期并更新访问密钥并ID。
希望这会有所帮助。
答案 8 :(得分:0)
with connections.cursor() as cursor:
res=cursor.execute(sql)
答案 9 :(得分:0)
我遇到了同样的问题,在 Django 中对我有用的是 this answer 中描述的内容,其中包括:
更换
'ENGINE': 'django.db.backends.mysql'
与
'ENGINE': 'mysql_server_has_gone_away'
开
settings.DATABASES['ENGINE']
并使用 pip 安装以下软件包:
mysql_server_has_gone_away==1.0.0