Python MySQL连接池工具类

  • 因为用到联合运算符 | ,所以python的版本需要>=3.10
# -*- coding: UTF-8 -*-
"""
执行带参数的SQL时,使用'%s'占位,用tuple/list进行条件匹配
在格式SQL中不需要使用引号指定数据类型,系统会根据输入参数自动识别
在输入的值中不需要使用转意函数,系统会自动处理
"""
import pymysql
from pymysql.cursors import DictCursor
from dbutils.pooled_db import PooledDB


class MySql(object):
    """
    MYSQL数据库对象,产生数据库连接 , 此类中的连接采用连接池实现
    """
    def __init__(self):
        """
        数据库构造函数,从连接池中取出连接,并生成操作游标
        """
        # 连接池对象
        self.__pool = PooledDB(creator=pymysql,
                               mincached=1,
                               maxcached=20,
                               host="localhost",
                               port=3306,
                               user="root",
                               passwd="password",
                               db="database_name",
                               use_unicode=True,
                               charset="utf8mb4",
                               cursorclass=DictCursor)
        self._conn = self.__pool.connection()
        self._cursor = self._conn.cursor()

    def get_all(self, sql: str, param: list | tuple = None) -> list[dict] | None:
        """
        执行查询,并取出所有结果集
        :param sql: 查询的SQL语句,如果有查询条件,请只指定条件列表,并将条件值使用参数'param'传递进来
        :param param: 可选参数,条件列表
        :return: 查询到的结果集
        """
        if param is None:
            param = []
        self._cursor.execute(sql, param)
        return self._cursor.fetchall() or None

    def get_one_row(self, sql: str, param: list | tuple = None) -> dict | None:
        """
        执行查询,并取出第一条
        :param sql: 查询的SQL语句,如果有查询条件,请只指定条件列表,并将条件值使用参数'param'传递进来
        :param param: 可选参数,条件列表
        :return: 查询到的结果集
        """
        if param is None:
            param = []
        self._cursor.execute(sql, param)
        return self._cursor.fetchone()

    def get_one_data(self, sql: str, param: list | tuple = None) -> int | str | None:
        """
        执行查询,并取出第一条的第一个数据
        :param sql: 查询的SQL语句,如果有查询条件,请只指定条件列表,并将条件值使用参数'param'传递进来
        :param param: 可选参数,条件列表
        :return: 查询到的结果/None
        """
        if param is None:
            param = []
        self._cursor.execute(sql, param)
        data = self._cursor.fetchone()
        return data and list(data.values())[0]

    def insert_one(self, sql: str, value: list | tuple) -> int:
        """
        向数据表插入一条记录
        :param sql: 执行的SQL语句
        :param value: 插入的记录数据
        :return: 插入记录的id值
        """
        self._cursor.execute(sql, value)
        return self._cursor.lastrowid

    def insert_many(self, sql: str, values: list[list] | tuple[tuple]) -> int:
        """
        向数据表插入多条记录
        :param sql: 执行的SQL语句
        :param values: 插入的记录数据集
        :return: 受影响的行数
        """
        self._cursor.executemany(sql, values)
        return self._cursor.rowcount

    def __query(self, sql: str, param: list | tuple) -> int:
        if param is None:
            param = []
        self._cursor.execute(sql, param)
        return self._cursor.rowcount

    def update(self, sql: str, param: list | tuple = None) -> int:
        """
        更新数据表记录
        :param sql: 执行的SQL语句
        :param param: 更新的数据列表
        :return: 受影响的行数
        """
        return self.__query(sql, param)

    def delete(self, sql: str, param: list | tuple = None) -> int:
        """
        删除数据表记录
        :param sql: 执行的SQL语句
        :param param: 删除的条件列表
        :return: 受影响的行数
        """
        return self.__query(sql, param)

    def commit(self, is_end: bool = True) -> None:
        """
        提交事务
        :param is_end: 可选参数,默认为True:提交事务,False:回滚事务
        """
        if is_end:
            self._conn.commit()
        else:
            self._conn.rollback()

    def dispose(self, is_end: bool = True):
        """
        释放连接资源
        :param is_end: 可选参数,默认为True:提交事务,False:回滚事务
        """
        self.commit(is_end)
        self._cursor.close()
        self._conn.close()

    def __del__(self):
        self.dispose()

结束~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值