Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查“是否”';MySQL服务器已经消失了'&引用;_Python_Mysql - Fatal编程技术网

Python 如何检查“是否”';MySQL服务器已经消失了'&引用;

Python 如何检查“是否”';MySQL服务器已经消失了'&引用;,python,mysql,Python,Mysql,我正在运行一个无限循环,但是每30-60分钟,我就会得到上面的错误。我想我想在每个循环迭代开始时添加一个条件,以检查MySQL服务器连接是否仍然连接正常。如果它已经消失了,那么我想在继续下一次迭代之前建立一个新的连接和游标 如何测试服务器是否在这里?这是一个合适的解决方案吗 谢谢大家! 您可以捕获操作错误异常并重新连接 cursor.execute(sql) File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", l

我正在运行一个无限循环,但是每30-60分钟,我就会得到上面的错误。我想我想在每个循环迭代开始时添加一个条件,以检查MySQL服务器连接是否仍然连接正常。如果它已经消失了,那么我想在继续下一次迭代之前建立一个新的连接和游标

如何测试服务器是否在这里?这是一个合适的解决方案吗


谢谢大家!

您可以捕获操作错误异常并重新连接

    cursor.execute(sql)
  File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 173, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')
如果明确希望在运行查询之前检查连接是否已断开,则可以运行测试查询以检查是否发生异常

我不确定还有什么其他情况会引起错误。但是如果您只想捕获MySQL服务器已经消失的错误,您可以这样做

from MySQLdb import OperationalError

try:
    my_sql_operation()
except OperationalError as e:
    #do what you want to do on the error
    reconnect()
    print e
它将只捕获“消失”错误,并允许引发由于其他原因引发的OperationalError异常

更新

正如我在评论中所说,我的查询功能如下:

from MySQLdb import OperationalError

try:
    my_sql_operation()
except OperationalError as e:
    if 'MySQL server has gone away' in str(e):
        #do what you want to do on the error
        reconnect()
        print e
    else:
        raise e()

这只是一个例子,可能不适合你的情况。我想说的一点是,最好为不同的事情使用不同的函数,这样您就可以轻松地处理这些情况。

您可以像shshank建议的那样捕获错误,或者使用类似的库自动重新连接。

无法将此作为对Andrew Johnson的注释添加,因此我将在这里回答

    cursor.execute(sql)
  File "/usr/lib64/python2.6/site-packages/MySQLdb/cursors.py", line 173, in execute
    self.errorhandler(self, exc, value)
  File "/usr/lib64/python2.6/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')
Torndb并不总是重新连接。您经常会看到臭名昭著的“MySQL已消失…”错误

处理这个问题的最好方法是为所有查询创建一个函数,并像其他人建议的那样使用它。另一种方法是向用户分发定时cookie,如果有人在足够长的时间内从您的网站请求某些内容,请参加以下课程:

def fetch_data(query):
    try:
        cursor = conn.Cursor()
        cursor.execute(query)
        return cursor.fetchall()
    except OperationalError as e:
        reconnect()
        print 'reconnecting and trying again...'
        fetch_data(query)

通过这种方式可以重新连接数据库,但对于有许多数据库的大型网站来说,这种方式的可扩展性不是很强。

因此,将我的代码全部转换为try/except是一种很好的处理方法?如果您有选择地捕获异常,这不应该是一个问题。但这也不是一个很好的审美方式。我要做的是创建一个函数来为我执行所有sql查询,它接受查询并返回结果。这样我就可以不用尝试了,除了在那个函数中。每次创建一个新的游标都需要很长时间吗?或者我应该传递一个光标?