python数据库自动重连_python mysql断开重连的实现方法
后臺服務在運行時發現一個問題,運行約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 數據庫圖解流程
Connection、Cursor形象比喻
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
connection對象支持的方法
Cursor對象支持的方法
用于執行查詢和獲取結果
execute方法:執行SQL,將結果從數據庫獲取到客戶端
調試代碼,將超時時間設置較長
self.connection._write_timeout = 10000
發現并沒有生效
使用try...except... 方法捕獲失敗后重新連接數據庫
try:
self.cursor.execute(sql)
except:
self.connection()
self.cursor.execute(sql)
直接拋出異常,并沒有執行except代碼段
打印self.connection ,輸出如下:
拋出異常重新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 mysql断开重连的实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将你一张表的值覆盖_精准度可达亚米级,山
- 下一篇: python字符串类型_Python3的