接口错误(0,'')
Posted
技术标签:
【中文标题】接口错误(0,\'\')【英文标题】:InterfaceError (0, '')接口错误(0,'') 【发布时间】:2011-10-02 19:36:42 【问题描述】:我使用 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, '')
【问题讨论】:
如果以下解决方案适合您,请记得接受。 【参考方案1】:这是由全局游标引起的。尝试在需要原始查询的每个方法中创建和关闭游标。
cursor = connection.cursor()
cursor.execute(query)
cursor.close()
【讨论】:
全局游标有什么问题?我遇到了这个问题并试图弄清楚发生了什么。 全局游标没有问题。这只是这个特殊问题的原因。我一直无法真正弄清楚发生了什么。由于这是一个不一致的错误,我认为这是 MySQL-python 中的一个错误。 看看下面 Moberg 的回答——这对我来说是正确的原因 我正在使用本地光标,但仍然遇到问题,有人可以帮忙吗?【参考方案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 完成的缓存。
【讨论】:
它不是 django 特有的。我遇到了这个问题,cherrypy 在 bluehost 上的 apache 后面运行,cherrypy 在 nginx 后面运行在 webfaction 上。这是一个 mysql-python 问题,我可以通过每次获取后关闭游标来解决。错误对我来说也是间歇性的。【参考方案3】:当您调用db.close()
并稍后尝试访问数据库而不创建新连接时,您会收到此错误。尝试查找是否在您不想关闭时关闭了与数据库的连接。
【讨论】:
这可以通过检查来完成:if( not db_handle.open): db_handle = MySQLdb.connect(**login_data)
就我个人而言,我不确定这是否是问题所在,至少在我的情况下是这样。我的 python 脚本中没有任何.close()
。但是,每次我早上重新启动本地服务器时(前一天晚上关闭后),我确实收到了这个错误。我的 python 脚本中唯一相关的是全局游标,而不是访问我的数据库的每个函数的本地游标。所以我更赞成@scrum 和他的回答......
@Poete_Maudit:当然,您可以按照描述获得此异常。也许还有其他方法可以触发相同的异常。【参考方案4】:
我同意莫伯格的观点。当我们关闭连接后尝试访问数据库时会导致此错误。这可能是由代码中的一些错误缩进引起的。下面是我的代码。
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() 后,一切正常。确认全局连接不是问题。
【讨论】:
【参考方案5】:我在 2019 年 4 月使用 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
...
【讨论】:
【参考方案6】:我在使用 Flask+pymysql 时遇到了同样的问题,我在 except:
块中得到了一个空元组,具体来说类似于 "(\"(0, '')\",)"
。
原来连接正在关闭,后来代码尝试访问它导致了这个错误。
所以我通过参考上述解决方案解决了这个问题,并使用了一个连接功能,每次我必须访问数据库时都会向我保证conn
。
您可以通过在访问 cursor
之前插入 conn.close()
来重现此问题。
作为参考,我使用了这个帮助我解决了这个问题的网站。
https://hackersandslackers.com/python-mysql-pymysql/
【讨论】:
【参考方案7】:对我来说,从我的函数中删除 conn.close()
是有效的。关闭后我试图再次访问数据库。
我正在使用带有 AWS 的烧瓶。
此外,如果您的烧瓶应用程序已经运行了很长时间,并且您也像我的情况一样使用带有 MYSQL 工作台的 AWS RDS,您也可以尝试重新启动它,然后只需检查您的会话是否已过期并更新访问密钥和身份证。
希望这会有所帮助。
【讨论】:
【参考方案8】:with connections.cursor() as cursor:
res=cursor.execute(sql)
【讨论】:
此答案已被标记为低质量,因为它只是没有解释的代码。如果您能解释为什么使用上下文管理器解决问题,那就太好了。【参考方案9】:我在使用 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
【讨论】:
【参考方案10】:我遇到了同样的问题,在 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
【讨论】:
以上是关于接口错误(0,'')的主要内容,如果未能解决你的问题,请参考以下文章
react jsonp请求接口成功,但是接口返回的response为空
调API接口查询数据时,请求参数的时间格式错误导致后台接口报400错误
命名空间“React”没有导出成员“InputHTMLAttributes”并且接口“MenuItemProps”错误地扩展了接口“ListItemProps”