Python连接MySQL - 使用连接池

代码

# -*- coding: utf-8 -*-
#  @Author  : markadc

import pymysql
from dbutils.pooled_db import PooledDB


# 异常重试
def auto_retry(func):
    def inner(*args, **kwargs):
        for i in range(3):
            try:
                return func(*args, **kwargs)
            except Exception as e:
                print('执行异常  >>  {}  >>  {}'.format(func.__name__, e))

    return inner


class MysqlConnectionPool:
    # mark为True,查询语句的返回结果为dict
    def __init__(self, cfg, mark=False):
        self.pool = PooledDB(pymysql, **cfg)
        self.mark = mark

    # 获取连接、游标
    def get_conn_curs(self):
        conn = self.pool.connection()
        curs = conn.cursor(pymysql.cursors.DictCursor) if self.mark else conn.cursor()
        return conn, curs

    # 关闭游标、连接
    def close_conn_curs(self, curs, conn):
        curs.close()
        conn.close()

    # 执行sql
    @auto_retry
    def exe_sql(self, sql, args=None, way=None):
        conn, curs = self.get_conn_curs()
        try:
            curs.execute(sql, args=args)
            conn.commit()
        except Exception as e:
            conn.rollback()
            print("error  >>  exe_sql  >>  {}".format(e))
            return False
        else:
            if way == 1:
                return curs.fetchone()
            elif way == 2:
                return curs.fetchall()
            else:
                return True
        finally:
            self.close_conn_curs(curs, conn)
            

使用示例

if __name__ == '__main__':
    cfg = {
        'host': 'localhost',
        'port': 3306,
        'user': '用户名',
        'password': '密码',
        'database': 'test',
        'charset': 'utf8mb4',
        'maxconnections': 4,    # 连接池允许的最大连接数
        'mincached': 0,         # 初始化连接池时创建的连接数。默认为0,即初始化时不创建连接
        'maxcached': 0,         # 连接池中空闲连接的最大数量。默认0,即无最大数量限制
        'maxusage': 0,          # 连接的最大使用次数。默认0,即无使用次数限制
        'blocking': True        # 连接数达到最大时,新连接是否可阻塞。默认False,即达到最大连接数时,再取新连接将会报错
    }
    handler = MysqlConnectionPool(cfg)

    # way默认为None
    # sql执行成功, 返回True
    # sql执行失败, 返回False
    res = handler.exe_sql('show tables', way=None)
    print(res)

    # way=1, 返回一条结果
    res = handler.exe_sql('show tables', way=1)
    print(res)

    # way=2, 返回所有结果
    res = handler.exe_sql('show tables', way=2)
    print(res)
    
    
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值