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