日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

python数据库自动重连_python mysql断开重连的实现方法

發(fā)布時間:2025/3/11 数据库 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python数据库自动重连_python mysql断开重连的实现方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

后臺服務在運行時發(fā)現(xiàn)一個問題,運行約15分鐘后,接口請求報錯

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

這個錯誤提示一般發(fā)生在將None賦給多個值,定位問題時發(fā)現(xiàn)

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

如何解決這個問題呢

出現(xiàn)問題的代碼

class MysqlConnection(object):

"""

mysql操作類,對mysql數(shù)據(jù)庫進行增刪改查

"""

def __init__(self, config):

# Connect to the database

self.connection = pymysql.connect(**config)

self.cursor = self.connection.cursor()

def Query(self, sql):

"""

查詢數(shù)據(jù)

:param sql:

:return:

"""

self.cursor.execute(sql)

return self.cursor.fetchall()

在分析問題前,先看看Python 數(shù)據(jù)庫的Connection、Cursor兩大對象

Python 數(shù)據(jù)庫圖解流程

Connection、Cursor形象比喻

Connection()的參數(shù)列表

host,連接的數(shù)據(jù)庫服務器主機名,默認為本地主機(localhost)

user,連接數(shù)據(jù)庫的用戶名,默認為當前用戶

passwd,連接密碼,沒有默認值

db,連接的數(shù)據(jù)庫名,沒有默認值

conv,將文字映射到Python類型的字典

cursorclass,cursor()使用的種類,默認值為MySQLdb.cursors.Cursor

compress,啟用協(xié)議壓縮功能

named_pipe,在windows中,與一個命名管道相連接

init_command,一旦連接建立,就為數(shù)據(jù)庫服務器指定一條語句來運行

read_default_file,使用指定的MySQL配置文件

read_default_group,讀取的默認組

unix_socket,在unix中,連接使用的套接字,默認使用TCP

port,指定數(shù)據(jù)庫服務器的連接端口,默認是3306

connection對象支持的方法

Cursor對象支持的方法

用于執(zhí)行查詢和獲取結果

execute方法:執(zhí)行SQL,將結果從數(shù)據(jù)庫獲取到客戶端

調(diào)試代碼,將超時時間設置較長

self.connection._write_timeout = 10000

發(fā)現(xiàn)并沒有生效

使用try...except... 方法捕獲失敗后重新連接數(shù)據(jù)庫

try:

self.cursor.execute(sql)

except:

self.connection()

self.cursor.execute(sql)

直接拋出異常,并沒有執(zhí)行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

在每次請求數(shù)據(jù)庫前執(zhí)行如下代碼

def reConnect(self):

try:

self.connection.ping()

except:

self.connection()

不過這樣的方式雖然能解決問題,但是感覺相對較low,希望有更好的處理方法

目前已實現(xiàn)的數(shù)據(jù)庫查詢這部分的代碼

import pymysql

class DBManager(object):

def __init__(self,config):

self.connection = pymysql.connect(**config) # config為數(shù)據(jù)庫登錄驗證配置信息

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()

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持。

總結

以上是生活随笔為你收集整理的python数据库自动重连_python mysql断开重连的实现方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。