python类操作数据库

首先说一下为什么要用类操作数据库

因为当使用函数连接数据库时,短时间连接是没有问题的但长时间连接会报 [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 会检查连接是否存在,断开的话会重连。

猜你喜欢

转载自blog.csdn.net/m0_54219225/article/details/128582610