python mysql断开重连的实现方法


Posted in Python onJuly 26, 2019

后台服务在运行时发现一个问题,运行约15分钟后,接口请求报错

pymysql.err.InterfaceError: (0, '')

这个错误提示一般发生在将None赋给多个值,定位问题时发现

pymysql.err.OperationalError: (2013, 'Lost connection to MySQL server during query')

如何解决这个问题呢

出现问题的代码

class MysqlConnection(object):

	"""
	mysql操作类,对mysql数据库进行增删改查
	"""

	def __init__(self, config):
		# Connect to the database
		self.connection = pymysql.connect(**config)
		self.cursor = self.connection.cursor()

	def Query(self, sql):
		"""
		查询数据
		:param sql:
		:return:
		"""
		self.cursor.execute(sql)
		return self.cursor.fetchall()

在分析问题前,先看看Python 数据库的Connection、Cursor两大对象

Python 数据库图解流程

python mysql断开重连的实现方法

Connection、Cursor形象比喻

python mysql断开重连的实现方法

Connection()的参数列表

  • host,连接的数据库服务器主机名,默认为本地主机(localhost)
  • user,连接数据库的用户名,默认为当前用户
  • passwd,连接密码,没有默认值
  • db,连接的数据库名,没有默认值
  • conv,将文字映射到Python类型的字典
  • cursorclass,cursor()使用的种类,默认值为MySQLdb.cursors.Cursor
  • compress,启用协议压缩功能
  • named_pipe,在windows中,与一个命名管道相连接
  • init_command,一旦连接建立,就为数据库服务器指定一条语句来运行
  • read_default_file,使用指定的MySQL配置文件
  • read_default_group,读取的默认组
  • unix_socket,在unix中,连接使用的套接字,默认使用TCP
  • port,指定数据库服务器的连接端口,默认是3306

python mysql断开重连的实现方法

connection对象支持的方法

python mysql断开重连的实现方法

Cursor对象支持的方法

用于执行查询和获取结果

python mysql断开重连的实现方法

execute方法:执行SQL,将结果从数据库获取到客户端

python mysql断开重连的实现方法

调试代码,将超时时间设置较长

self.connection._write_timeout = 10000

发现并没有生效

使用try...except... 方法捕获失败后重新连接数据库

try:
	self.cursor.execute(sql)
except:
	self.connection()
	self.cursor.execute(sql)

直接抛出异常,并没有执行except代码段

打印self.connection ,输出如下:

<pymysql.connections.Connection object at 0x0000000003E2CCC0>

抛出异常重新connect是不行的,因为connections 仍存在未失效

找到一种方法可以解决问题,在每次连接之前,判断该链接是否有效,pymysql提供的接口是 Connection.ping()

这个该方法的源码

def ping(self, reconnect=True):
    """Check if the server is alive"""
    if self._sock is None:
      if reconnect:
        self.connect()
        reconnect = False
      else:
        raise err.Error("Already closed")
    try:
      self._execute_command(COMMAND.COM_PING, "")
      return self._read_ok_packet()
    except Exception:
      if reconnect:
        self.connect()
        return self.ping(False)
      else:
        raise

在每次请求数据库前执行如下代码

def reConnect(self):
	try:
		self.connection.ping()
	except:
		self.connection()

不过这样的方式虽然能解决问题,但是感觉相对较low,希望有更好的处理方法

目前已实现的数据库查询这部分的代码

import pymysql
class DBManager(object):

  def __init__(self,config):
    self.connection = pymysql.connect(**config) # config为数据库登录验证配置信息
    self.cursor = self.connection.cursor()

  def query(self, sql, params):
    try:
      with self.connection.cursor() as cursor:
        cursor.execute(sql, params)
        result = cursor.fetchall()
        self.connection.commit()
        return result
        # self.connection.close()
    except Exception as e:
      traceback.print_exc()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python编写网页爬虫脚本并实现APScheduler调度
Jul 28 Python
python通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
python抓取百度首页的方法
May 19 Python
Python函数返回值实例分析
Jun 08 Python
Python常见字典内建函数用法示例
May 14 Python
Sanic框架安装与简单入门示例
Jul 16 Python
tensorflow实现图像的裁剪和填充方法
Jul 27 Python
Python日志无延迟实时写入的示例
Jul 11 Python
python+mysql实现个人论文管理系统
Oct 25 Python
python实现录屏功能(亲测好用)
Mar 02 Python
python中数组和列表的简单实例
Mar 25 Python
Python中requests库的用法详解
Jun 05 Python
seek引发的python文件读写的问题及解决
Jul 26 #Python
python经典趣味24点游戏程序设计
Jul 26 #Python
对django后台admin下拉框进行过滤的实例
Jul 26 #Python
python函数的万能参数传参详解
Jul 26 #Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 #Python
Django REST Framework序列化外键获取外键的值方法
Jul 26 #Python
django admin.py 外键,反向查询的实例
Jul 26 #Python
You might like
PHP转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
php使用function_exists判断函数可用的方法
2014/11/19 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
在javascript将NodeList作为Array数组处理的方法
2010/07/09 Javascript
JavaScript对IE操作的经典代码(推荐)
2014/03/10 Javascript
web前端开发JQuery常用实例代码片段(50个)
2015/08/28 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
bootstrap table表格插件使用详解
2017/05/08 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
webstorm中vue语法的支持详解
2018/05/09 Javascript
jquery分页插件pagination使用教程
2018/10/23 jQuery
JS 验证码功能的三种实现方式
2018/11/26 Javascript
使用pm2部署node生产环境的方法步骤
2019/03/09 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
Openlayers绘制地图标注
2020/09/28 Javascript
JavaScript canvas实现文字时钟
2021/01/10 Javascript
Python使用googletrans报错的解决方法
2018/09/25 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
python pygame实现五子棋小游戏
2020/10/26 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
浅谈Python中range与Numpy中arange的比较
2020/03/11 Python
基于CentOS搭建Python Django环境过程解析
2020/08/24 Python
应届生求职推荐信
2013/10/28 职场文书
开办加工厂创业计划书
2014/01/03 职场文书
便利店促销方案
2014/02/20 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
写给老师的保证书
2015/05/09 职场文书
如何写观后感
2015/06/19 职场文书
村官2015年度工作总结
2015/10/14 职场文书
详解Laravel框架的依赖注入功能
2021/05/27 PHP
SpringBoot快速入门详解
2021/07/21 Java/Android