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中的变量和作用域详解
Jul 13 Python
解决Matplotlib图表不能在Pycharm中显示的问题
May 24 Python
python利用Tesseract识别验证码的方法示例
Jan 21 Python
浅谈python之高阶函数和匿名函数
Mar 21 Python
Python企业编码生成系统之系统主要函数设计详解
Jul 26 Python
python爬虫 execjs安装配置及使用
Jul 30 Python
Python字典底层实现原理详解
Dec 18 Python
python面向对象之类属性和类方法案例分析
Dec 30 Python
使用pyecharts1.7进行简单的可视化大全
May 17 Python
Python:__eq__和__str__函数的使用示例
Sep 26 Python
2021年最新用于图像处理的Python库总结
Jun 15 Python
Django框架模板用法详解
Jun 10 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
基于pear auth实现登录验证
2010/02/26 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
基于curl数据采集之正则处理函数get_matches的使用
2013/04/28 PHP
JavaScript高级程序设计 读书笔记之十一 内置对象Global
2012/03/07 Javascript
JavaScript原型链示例分享
2014/01/26 Javascript
js验证IP及子网掩码的合法性有效性示例
2014/04/30 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
微信小程序 wx:for的使用实例详解
2017/04/27 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
详解vue-cli本地环境API代理设置和解决跨域
2017/09/05 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
解析vue中的$mount
2017/12/21 Javascript
基于jquery实现左右上下移动效果
2018/05/02 jQuery
200行HTML+JavaScript实现年会抽奖程序
2019/01/22 Javascript
Vue动态修改网页标题的方法及遇到问题
2019/06/09 Javascript
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
python网络编程学习笔记(四):域名系统
2014/06/09 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
python使用matplotlib库生成随机漫步图
2018/08/27 Python
python批量爬取下载抖音视频
2019/06/17 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
2019/08/23 Python
python3 配置logging日志类的操作
2020/04/08 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
python 实现简易的记事本
2020/11/30 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
校园文化建设方案
2014/02/03 职场文书
利用javaScript处理常用事件详解
2021/04/14 Javascript
图文详解matlab原始处理图像几何变换
2021/07/09 Python
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript