python数据库连接池DBUtils

        官方介绍:DBUtils是一套为数据库提供可靠,持久和池式连接的工具,可用于各种多线程环境,如Python Webware或其他Web应用程序服务器。该套件支持符合DB-API 2的数据库接口和经典的PyGreSQL接口。

        DBUtils套件是作为一个Python软件包实现的,其中包含两个模块子集,一个用于任意DB-API 2模块,另一个用于经典PyGreSQL模块。

        如图示:

python数据库连接池DBUtils_第1张图片

关于下载:

pip install DBUtils

        需要注意的是,DBUtils至少需要Python版本2.6。经典PyGreSQL变体中的模块需要PyGreSQL 3.4或更高版本,而通用DB-API 2变体中的模块可以与任何符合Python DB-API 2的数据库接口模块一起运行。

关于使用PooleDB模块(我是用的这个)

使用PooledDB模块,首先需要通过创建PooledDB实例来设置数据库连接池,并传递以下参数:
    创建者:可以是返回新的DB-API 2连接对象的任意函数,也可以是符合DB-API 2的数据库模块
    mincached:池中空闲连接的初始数量(缺省值为0表示在启动时没有连接)
    maxcached:池中空闲连接的最大数量(默认值0或无意味着池的大小无限制)
    maxshared:允许的最大共享连接数(默认值0或None表示所有连接都是专用的)
    达到此最大数量时,如果连接请求为可共享,则会共享连接。
    maxconnections:一般允许的最大连接数(默认值0或None表示任意数量的连接)
    阻塞:确定超过最大值时的行为
    如果设置为true,则阻止并等待连接数减少,但默认情况下会报告错误。
    maxusage:单个连接重用的最大次数(缺省值为0或None表示无限次重用)
    当达到连接的最大使用数量时,连接会自动重置(关闭并重新打开)。
    setsession:可用于准备会话的SQL命令的可选列表,例如[“set datestyle to german”,...]
    重置:连接在返回到池时应该如何重置(False或None回滚transcations以begin()开头,默认值为true总是会出于安全考虑而进行回滚)
    失败:如果缺省值(OperationalError,InternalError)不足,则应应用连接故障转移机制的可选异常类或异常类元组
    ping:一个可选标志,用于控制在使用ping()方法检查连接时是否有可用标志(0 = 无 =从不,1 =默认=每当从池中获取时,  2 =创建游标时,4 =执行查询,  7 =始终,以及这些值的所有其他位组合)
    指定为创建者的DB-API 2兼容数据库模块的创建者函数或连接函数将接收任何其他参数,例如主机,数据库,用户,密码等。您可以在您自己的创建者中选择部分或全部这些参数功能,允许复杂的故障转移和负载平衡机制。

附上代码:

1、连接池代码:

#coding:utf-8
import MySQLdb
from MySQLdb.cursors import DictCursor
from DBUtils.PooledDB import PooledDB
from BaseSettings import BaseSettings  #这是关于数据的设置,做成类的原因是为了适应多个数据库

class Mysql(object):
    __pool = None
    def __init__(self,DBNAME):
        self._conn = Mysql.__getConn(DBNAME)
        self._cursor = self._conn.cursor()

    @staticmethod
    def __getConn(DBNAME):
        if Mysql.__pool == None:
             Configs = BaseSettings()
             Config = Configs.gqqBseInfo()
             __pool = PooledDB(creator=MySQLdb, mincached=1, maxcached=20,\
                        host=Config['DBHOST'], port=Config['DBPORT'], user=Config['DBUSER'], passwd=Config['DBPWD'],\
                        db=DBNAME,use_unicode=False,charset=Config['DBCHAR'],cursorclass=DictCursor)
        return __pool.connection()


    def getInfo(self,sql,param=None):
        """
        @summary: 执行查询,并取出num条结果
        @param sql:查询SQL,如果有查询条件,请只指定条件列表,并将条件值使用参数[param]传递进来
        @param num:取得的结果条数
        @param param: 可选参数,条件列表值(元组/列表)
        @return: result list/boolean 查询到的结果集
        """
        if param == None:
            info = self._cursor.execute(sql)
        else:
            info = self._cursor.execute(sql,param)
        if info>0:
            result = self._cursor.fetchall()
        else:
            result = False
        return result

    def insert(self,sql,values):
        """
        @summary: 向数据表插入多条记录
        @param sql:要插入的SQL格式
        @param values:要插入的记录数据tuple(tuple)/list[list]
        @return: count 受影响的行数
        """
        try:
            self._cursor.execute(sql,values)
            self._conn.commit()
        except Exception,e:
            print ('Error : {}'.format(e))
            self._conn.rollback()
        finally:
            self._cursor.close()
            self._conn.close()

    def insertMany(self,sql,data):
        try:
            self._cursor.executemany(sql, data)
            self._conn.commit()
        except Exception,e:
            print ('Error : {}'.format(e))
            self._conn.rollback()
        finally:
            self._cursor.close()
            self._conn.close()

    def begin(self):
        """
        @summary: 开启事务
        """
        self._conn.autocommit(0)

    def end(self,option='commit'):
        """
        @summary: 结束事务
        """
        self._conn.commit()


    def dispose(self):
        """
        @summary: 释放连接池资源
        """

        self._conn.commit()
        self._cursor.close()
        self._conn.close()

2、数据库操作demo

#coding:utf-8
from DBUtil import Mysql
import traceback
import logging


class DBInteraction():


    def __init__(self):
        logging.basicConfig(filename='./logger.log', level=logging.INFO)
        self.logger = logging.getLogger()

    def InsertUserInfo(self,InsertSql,InsertList,DBName):
        insert_sql = InsertSql
        mysql = Mysql(DBName)
        mysql.insert(insert_sql,InsertList)

    def insertManyUserinfo(self,insertSql,insertList,DBName):
        mysql = Mysql(DBName)
        mysql.insertMany(insertSql,insertList)

    def getInfoFromDB(self,searchSql,DBName):
        mysql = Mysql(DBName)
        infoList = []
        try:
            infoList = mysql.getInfo(searchSql)
        except Exception:
            self.logger.error(traceback.print_exc())
        finally:
            mysql.dispose()
        return infoList
最后,附上官方文档:https://cito.github.io/DBUtils/UsersGuide.html




你可能感兴趣的:(Python)