Python pymysql 封装 整合数据库连接池

一、Python封装文件
mysql_server.py

#! /usr/bin/python
# -*- coding: UTF-8 -*-

import pymysql
from dbutils.pooled_db import PooledDB
from common.db.mysql_config import MysqlConfig

"""
    pymysql封装总结
    https://blog.csdn.net/zhj_1121/article/details/121070412
    
    python操作mysql之只看这篇就够了
    https://www.jianshu.com/p/4e72faebd27f
    
    关于PooledDB使用autocommit的方法
    https://blog.51cto.com/abyss/1736844
"""


class MysqlPool:
    """
    MySQL 数据库连接池类 配置变量
    """

    '''
        :param
        reset: how connections should be reset when returned to the pool
            (False or None to rollback transcations started with begin(),
            True to always issue a rollback for safety's sake)

        :param 
        setsession: optional list of SQL commands that may serve to prepare
            the session, e.g. ["set datestyle to ...", "set time zone ..."]
    '''

    '''
        https://blog.51cto.com/abyss/1736844
        其中的
        setsession=['SET AUTOCOMMIT = 1']
        就是用来设置线程池是否打开自动更新的配置,0为False,1为True
    '''

    # 初始化数据库连接池变量
    __pool = None

    # 创建连接池的最大数量
    __MAX_CONNECTIONS = 100
    # 连接池中空闲连接的初始数量
    __MIN_CACHED = 10
    # 连接池中空闲连接的最大数量
    __MAX_CACHED = 20
    # 共享连接的最大数量
    __MAX_SHARED = 10

    # 超过最大连接数量时候的表现,为True等待连接数量下降,为false直接报错处理
    __BLOCK = True
    # 单个连接的最大重复使用次数
    __MAX_USAGE = 100

    # 当返回到池时,连接应该如何重置
    # (False或None回滚以begin()开始的事务,为了安全起见,总是发出回滚)
    __RESET = True
    # 设置自动提交
    __SET_SESSION = ['SET AUTOCOMMIT = 1']

    # 不能是 UTF-8
    __CHARSET = 'UTF8'

    def __init__(self, host, port, user, password, database):
        """
        :param host: 数据库主机地址
        :param port: 端口号
        :param user: 用户名
        :param password: 密码
        :param database: 数据库名
        """
        if not self.__pool:
            # self代表当前类的实例,即为 MysqlPool() 带小括号,执行后的数据。
            # __class__,魔法函数,代表从当前类的实例中,获取当前类,即为 MysqlPool 不带小括号的类。
            # __pool,这个代表的事类的变量,即为在类下面创建的初始化连接池,__pool
            self.__class__.__pool = PooledDB(
                creator=pymysql,
                host=host,
                port=port,
                user=user,
                password=password,
                database=database,

                maxconnections=self.__MAX_CONNECTIONS,
                mincached=self.__MIN_CACHED,
                maxcached=self.__MAX_CACHED,
                maxshared=self.__MAX_SHARED,

                blocking=self.__BLOCK,
                maxusage=self.__MAX_USAGE,
                setsession=self.__SET_SESSION,
                reset=self.__RESET,

                charset=self.__CHARSET
            )

    def get_connect(self):
        return self.__pool.connection()


class MysqlCursor:
    """
    从数据库配置环境,取出数据库配置参数
    这里的参数,可以不从外部导入,直接手动写入也可以。
    """
    host = MysqlConfig().current_config()[0]
    port = MysqlConfig().current_config()[1]
    user = MysqlConfig().current_config()[2]
    password = MysqlConfig().current_config()[3]
    database = MysqlConfig().current_config()[4]

    def __init__(self, host=host, port=port, user=user, password=password, database=database) -> None:
        """
        :param host: 数据库主机地址
        :param port: 端口号
        :param user: 用户名
        :param password: 密码
        :param database: 数据库名
        """
        self.__host = host
        self.__port = port
        self.__user = user
        self.__password = password
        self.__database = database

        # 初始化数据库连接池
        self.connects_pool = MysqlPool(
            host=self.__host,
            port=self.__port,
            user=self.__user,
            password=self.__password,
            database=self.__database
        )

    def __enter__(self):
        """
        # with 上下文管理,魔法函数,进入with时调用
        :return: 当前类
        """
        # 从数据库链接池,获取一个数据库链接
        connect = self.connects_pool.get_connect()
        # 从获取的数据库链接,获取一个光标
        cursor = connect.cursor(pymysql.cursors.DictCursor)

        '''
        # https://blog.51cto.com/abyss/1736844
        # 如果使用连接池 则不能在取出后设置 而应该在创建线程池时设置
        # connect.autocommit = False 
        '''
        # 将数据库链接,赋值给当前类,方便__exit__函数调用
        self._connect = connect
        # 将数据库光标,赋值给当前类,方便__exit__函数调用
        self._cursor = cursor

        # __enter__函数,必须返回当前类
        return self

    def __exit__(self, *exc_info):
        """
        # with 上下文管理,魔法函数,退出with时调用
        :param exc_info: 异常信息,元祖
        :return: None
        """
        # 退出with上下文时,使用当前类链接,提交数据库语句
        self._connect.commit()
        # 关闭光标
        self._cursor.close()
        # 关闭链接
        self._connect.close()

    @property
    def cursor(self):
        """
        数据库连接池,取出链接,取出光标,转换为光标属性
        :return: 数据库连接池的光标
        """
        return self._cursor


if __name__ == "__main__":

    with MysqlCursor() as db:
        # 获取数据库的方法
        sql = 'select count(id) as total from people'
        db.cursor.execute("select count(id) as total from people")
        data = db.cursor.fetchone()
        print('--------统计数据条数', data)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容