Python数据库MySQL连接池DBUtils

 

 

DBUtils 是一套允许线程化 Python 程序可以安全和有效的访问数据库的模块

一、下载安装

  • 1.1 从pypi下载

https://pypi.python.org/pypi/DBUtils

$ wget https://pypi.python.org/packages/65/65/89afee016aca7fbb5c1642e6ef3864d80af808dc5efa7367b328093eece9/DBUtils-1.1.tar.gz
  • 1.2 安装
    方法1:
cd DBUtils-1.1
python setup.py install
  • 方法2:使用pip
$ pip search DBUtils
DBUtils                   - Database connections for multi-threaded environments.

 

二、PooledDB

参数如下:

  • dbapi :数据库接口
  • mincached :启动时开启的空连接数量
  • maxcached :连接池最大可用连接数量
  • maxshared :连接池最大可共享连接数量
  • maxconnections :最大允许连接数量
  • blocking :达到最大数量时是否阻塞
  • maxusage :单个连接最大复用次数
  • setsession :用于传递到数据库的准备会话,如 [”set name UTF-8″] 。

 

# -*- coding: UTF-8 -*-
"""
desc:数据库操作类
@note:
1、执行带参数的SQL时,请先用sql语句指定需要输入的条件列表,然后再用tuple/list进行条件批配
2、在格式SQL中不需要使用引号指定数据类型,系统会根据输入参数自动识别
3、在输入的值中不需要使用转意函数,系统会自动处理
"""

import MySQLdb
from MySQLdb.cursors import DictCursor
from DBUtils.PooledDB import PooledDB

import Config

"""
Config是一些数据库的配置文件
"""

class Mysql(object):
    """
        MYSQL数据库对象,负责产生数据库连接 , 此类中的连接采用连接池实现
        获取连接对象:conn = Mysql.getConn()
        释放连接对象;conn.close()或del conn
    """
    #连接池对象
    __pool = None
    def __init__(self):
        """
        数据库构造函数,从连接池中取出连接,并生成操作游标
        """
#        self._conn = MySQLdb.connect(host=Config.DBHOST , port=Config.DBPORT , user=Config.DBUSER , passwd=Config.DBPWD ,
#                              db=Config.DBNAME,use_unicode=False,charset=Config.DBCHAR,cursorclass=DictCursor)
        self._conn = Mysql.__getConn()
        self._cursor = self._conn.cursor()

    @staticmethod
    def __getConn():
        """
        @summary: 静态方法,从连接池中取出连接
        @return MySQLdb.connection
        """
        if Mysql.__pool is None:
            __pool = PooledDB(creator=MySQLdb, mincached=1 , maxcached=20 ,
                              host=Config.DBHOST , port=Config.DBPORT , user=Config.DBUSER , passwd=Config.DBPWD ,
                              db=Config.DBNAME,use_unicode=False,charset=Config.DBCHAR,cursorclass=DictCursor)
        return __pool.connection()

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

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

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

    def insertOne(self,sql,value):
        """
        @summary: 向数据表插入一条记录
        @param sql:要插入的SQL格式
        @param value:要插入的记录数据tuple/list
        @return: insertId 受影响的行数
        """
        self._cursor.execute(sql,value)
        return self.__getInsertId()

    def insertMany(self,sql,values):
        """
        @summary: 向数据表插入多条记录
        @param sql:要插入的SQL格式
        @param values:要插入的记录数据tuple(tuple)/list[list]
        @return: count 受影响的行数
        """
        count = self._cursor.executemany(sql,values)
        return count

    def __getInsertId(self):
        """
        获取当前连接最后一次插入操作生成的id,如果没有则为0
        """
        self._cursor.execute("SELECT @@IDENTITY AS id")
        result = self._cursor.fetchall()
        return result[0]['id']

    def __query(self,sql,param=None):
        if param is None:
            count = self._cursor.execute(sql)
        else:
            count = self._cursor.execute(sql,param)
        return count

    def update(self,sql,param=None):
        """
        @summary: 更新数据表记录
        @param sql: SQL格式及条件,使用(%s,%s)
        @param param: 要更新的  值 tuple/list
        @return: count 受影响的行数
        """
        return self.__query(sql,param)

    def delete(self,sql,param=None):
        """
        @summary: 删除数据表记录
        @param sql: SQL格式及条件,使用(%s,%s)
        @param param: 要删除的条件 值 tuple/list
        @return: count 受影响的行数
        """
        return self.__query(sql,param)

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

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

    def dispose(self,isEnd=1):
        """
        @summary: 释放连接池资源
        """
        if isEnd==1:
            self.end('commit')
        else:
            self.end('rollback');
        self._cursor.close()
        self._conn.close()

 

#-*- coding: utf-8 -*-  
""" 
数据库管理类 
"""  
import MySQLdb  
from DBUtils.PooledDB import PooledDB  
#自定义的配置文件,主要包含DB的一些基本配置  
from config import configs  

#数据库实例化类  
class DbManager(Singleton):  

    def __init__(self):  
        connKwargs = {'host':configs['DB_HOST'], 'user':configs['DB_USER'], 'passwd':configs['DB_PASS'], 'db':configs['DB_NAME'], 'charset':"utf8"}  
        self._pool = PooledDB(MySQLdb, mincached=0, maxcached=10, maxshared=10, maxusage=10000, **connKwargs)  

    def getConn(self):  
        return self._pool.connection()  

_dbManager = DbManager()  

def getConn():  
    """ 获取数据库连接 """  
    return _dbManager.getConn()  

def executeAndGetId(sql, param=None):  
    """ 执行插入语句并获取自增id """  
    conn = getConn()  
    cursor = conn.cursor()  
    if param == None:  
        cursor.execute(sql)  
    else:  
        cursor.execute(sql, param)  
    id = cursor.lastrowid  
    cursor.close()  
    conn.close()  

    return id  

def execute(sql, param=None):  
    """ 执行sql语句 """  
    conn = getConn()  
    cursor = conn.cursor()  
    if param == None:  
        rowcount = cursor.execute(sql)  
    else:  
        rowcount = cursor.execute(sql, param)  
    cursor.close()  
    conn.close()  

    return rowcount  

def queryOne(sql):  
    """ 获取一条信息 """  
    conn = getConn()  
    cursor = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)  
    rowcount = cursor.execute(sql)  
    if rowcount > 0:  
        res = cursor.fetchone()  
    else:  
        res = None  
    cursor.close()  
    conn.close()  

    return res  

def queryAll(sql):  
    """ 获取所有信息 """  
    conn = getConn()  
    cursor = conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)  
    rowcount = cursor.execute(sql)  
    if rowcount > 0:  
        res = cursor.fetchall()  
    else:  
        res = None  
    cursor.close()  
    conn.close()  

    return res  

if __name__ == "__main__":  
    res = execute('select count(*) from myt_link_list')  
    print str(res)  

    res = queryOne('select * from myt_link_list limit 20000, 1')  
    print str(res)  

    res = queryAll('select * from myt_link_list limit 10')  
    print str(res)  

三、PersistentDB&PooledDB对比

https://www.cnblogs.com/moyand/p/9046862.html

https://blog.csdn.net/JUandjuddd/article/details/106222657

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值