官方介绍:DBUtils是一套为数据库提供可靠,持久和池式连接的工具,可用于各种多线程环境,如Python Webware或其他Web应用程序服务器。该套件支持符合DB-API 2的数据库接口和经典的PyGreSQL接口。
DBUtils套件是作为一个Python软件包实现的,其中包含两个模块子集,一个用于任意DB-API 2模块,另一个用于经典PyGreSQL模块。
如图示:
关于下载:
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