首先说一下为什么要用类操作数据库
因为当使用函数连接数据库时,短时间连接是没有问题的但长时间连接会报 [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。
原因是没有断开数据库连接而超过了数据库的最大连接数,此时当你用命令查看3306 端口的占用情况会发现大量的 TIME_WAIT 连接
netstat -aon|findstr "3306"
直接上代码
# 定义一个数据库相关的配置项
DB_CONFIG = {
'host': '127.0.0.1',
'user': 'root',
'password': 'root',
'port': 3306,
'db': 'my_db',
'charset': 'utf8'
}
class SQLManager(object):
# 连接数据库
# 将conn,cursor作为类的属性,通过connect方法触发生成
def __init__(self):
self.conn = None
self.cur = None
self.connect()
def connect(self):
self.conn = pymysql.connect(
host=DB_CONFIG['host'],
port=DB_CONFIG['port'],
user=DB_CONFIG['user'],
password=DB_CONFIG['password'],
db=DB_CONFIG['db'],
charset=DB_CONFIG['charset']
)
# 检查连接是否存在,断开的话会重连。
self.conn.ping(reconnect=True)
# 链接mysql 生成游标对象
self.cur = self.conn.cursor()
# 单条增删改数据,创建表
def modify(self, sql, *args):
try:
self.conn.begin()
self.cur.execute(sql, *args) # 修改,由arge改为*args
self.conn.commit()
print('数据库操作成功!')
return True
except pymysql.Error as e:
print('数据库操作失败:' + str(e))
self.conn.rollback()
return False
# 关闭数据库cursor和连接
def __del__(self):
self.cur.close()
self.conn.close()
print('数据库成功断开链接!')
说一下 self.conn.ping(reconnect=True)
如果不加上这一段代码,连接数据库的时候会报pymysql.err.InterfaceError: (0, '')
导致这个错误的原因是通过pymysql 连接数据库没有重连机制,当连接时间超过了数据库设置的 wait_timeout ,mysql会断开连接,当加上 self.conn.ping(reconnect=True) 时pymysql 会检查连接是否存在,断开的话会重连。