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


pymysql錯誤:

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

錯誤原因:

MySQL持久化鏈接保持時間為8小時(28800秒),過期后斷開連。如果數據庫沒有新建連接,則會報此錯。

mysql> SHOW SESSION VARIABLES LIKE 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+

解決思路:

調用前判斷連接是否有效,如果有效繼續,無效創建連接。

class DataBase():
    """數據庫類"""

    def __init__(self, host='localhost', user='root', pw='password', db='test'):
        self.con = pymysql.connect(host, user, pw, db)
        self.cur = self.con.cursor()

# 方法1:
    def _reCon (self): 
        """ MySQLdb.OperationalError異常"""
        # self.con.close() 
        while True:
            try: 
                self.con.ping()
                break
            except OperationalError:
                self.con.ping(True)

# 方法2:
    def _reConn (self,num=28800,stime=3): 
        """
        校驗數據庫連接是否異常
        num:8小時
        stime:間隔3秒重連
        """
        _number = 0
        _status = True
        while _status and _number <= num:
            try:
                self.con.ping()         #cping 校驗連接是否異常
                _status = False
            except:
                if self.con == True: #重新連接,成功退出
                    _status = False
                    break
                _number +=1
                time.sleep(stime)   #連接不成功,休眠3秒鍾,繼續循環,直到循環8小時
                
    def insert_visitor_info(self, time, device_id, room_id):
        """插入訪客請求信息"""
        self._reCon()
        # self._reConn()
        with self.con:
            sql = "INSERT INTO visitor(time,device_id,room_id) VALUES(%s,%s,%s)"
            self.cur.execute(sql, (time, device_id, room_id))
if __name__ == '__main__':

    db = DataBase()
    db.insert_visitor_info('2019-03-31 17:57:08','8b417cb51268','312')

鳴謝地址:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM