您的位置:首页 > 编程语言 > Python开发

Python学习一:基于DBUtils和pymysql的MySQL数据库连接池封装

2016-11-25 17:37 621 查看

前言

Python安装及配置略,本文前默认已经配置好Python环境。

打开cmd,输入python,出现以下画面表示Python安装成功。



需要库

1、DBUtils 下载地址:DBUtils

2、pymysql 下载地址:pymysql

说明:DBUtils 暂时不支持Python3

下载解压后,cmd进入库根目录,执行 :python setup.py install 进行安装。

另外可以使用pip命令在线安装,打开cmd,输入 :pip install DBUtils,即可进行自动安装。

说明:

DBUtils是一套Python数据库连接池包,并允许对非线程安全的数据库接口进行线程安全包装。DBUtils来自Webware for Python。

DBUtils提供两种外部接口:

* PersistentDB :提供线程专用的数据库连接,并自动管理连接。

* PooledDB :提供线程间可共享的数据库连接,并自动管理连接。

实现

在实际数据库操作中,使用完毕后需要关闭游标(cursor)和连接(connection),为了简化代码,获取数据库连接采用 With open as …方式,执行完毕后自动关闭连接, 无需主动关闭。

1、数据库参数配置

DB_config.py

#-*- coding: UTF-8 -*-
'''
@描述:数据库配置信息
@作者:CYH
@版本:V1.0
@创建时间:2016-11-24 上午9:23:06
'''

#TEST数据库信息
DB_TEST_HOST="127.0.0.1";
DB_TEST_PORT=3306;
DB_TEST_DBNAME="sy";
DB_TEST_USER="root";
DB_TEST_PASSWORD="123456";

#数据库连接编码
DB_CHARSET="utf8";

#mincached : 启动时开启的闲置连接数量(缺省值 0 以为着开始时不创建连接)
DB_MIN_CACHED=10;

#maxcached : 连接池中允许的闲置的最多连接数量(缺省值 0 代表不闲置连接池大小)
DB_MAX_CACHED=10;

#maxshared : 共享连接数允许的最大数量(缺省值 0 代表所有连接都是专用的)如果达到了最大数量,被请求为共享的连接将会被共享使用
DB_MAX_SHARED=20;

#maxconnecyions : 创建连接池的最大数量(缺省值 0 代表不限制)
DB_MAX_CONNECYIONS=100;

#blocking : 设置在连接池达到最大数量时的行为(缺省值 0 或 False 代表返回一个错误<toMany......>; 其他代表阻塞直到连接数减少,连接被分配)
DB_BLOCKING=True;

#maxusage : 单个连接的最大允许复用次数(缺省值 0 或 False 代表不限制的复用).当达到最大数时,连接会自动重新连接(关闭和重新打开)
DB_MAX_USAGE=0;

#setsession : 一个可选的SQL命令列表用于准备每个会话,如["set datestyle to german", ...]
DB_SET_SESSION=None;


2、数据库连接创建、连接获取

# -*- coding: UTF-8 -*-
"""
@描述:数据库连接池管理模块
@作者:CYH
@版本:V1.0
@创建时间:2016-11-24 上午8:43:14
"""

import pymysql;
from DBUtils.PooledDB import PooledDB;

import DB_config as Config;

'''
@功能:PT数据库连接池
'''
class PTConnectionPool(object):
__pool = None;
def __enter__(self):
self.conn = self.__getConn();
self.cursor = self.conn.cursor();
print "PT数据库创建con和cursor";
return self;

def getConn(self):
if self.__pool is None:
self.__pool = PooledDB(creator=pymysql, mincached=Config.DB_MIN_CACHED , maxcached=Config.DB_MAX_CACHED,
maxshared=Config.DB_MAX_SHARED, maxconnections=Config.DB_MAX_CONNECYIONS,
blocking=Config.DB_BLOCKING, maxusage=Config.DB_MAX_USAGE,
setsession=Config.DB_SET_SESSION,
host=Config.DB_TEST_HOST , port=Config.DB_TEST_PORT ,
user=Config.DB_TEST_USER , passwd=Config.DB_TEST_PASSWORD ,
db=Config.DB_TEST_DBNAME , use_unicode=False, charset=Config.DB_CHARSET);

return self.__pool.connection()

"""
@summary: 释放连接池资源
"""
def __exit__(self, type, value, trace):
self.cursor.close()
self.conn.close()

print "PT连接池释放con和cursor";

'''
@功能:获取PT数据库连接
'''
def getPTConnection():
return PTConnectionPool();


3、获取连接操作数据库

#-*- coding: UTF-8 -*-
'''
@描述:
@作者:CYH
@版本:V1.0
@创建时间:2016-11-24 上午9:34:54
'''
from DB_connetion_pool import getPTConnection, PTConnectionPool;

def TestMySQL():
#申请资源
with getPTConnection() as db:
# SQL 查询语句;
sql = "SELECT * FROM sy_user";
try:
# 获取所有记录列表
db.cursor.execute(sql)
results = db.cursor.fetchall();
for row in results:
userId = row[0]
name= row[1]
sex= row[2]
createTime = row[3]
# 打印结果
print ("userId=%d,name=%s,sex=%s,createTime=%s" %\
(userId, name, sex, createTime ))
except:
print ("Error: unable to fecth data")

TestMySQL()


总结

采用DBUtils和pymyql实现数据库连接池操作,使用Python内置的With open as db 实现数据库连接使用完后自动关闭。

说明:本文提供内容及代码仅作为学习、测试使用,未做详细性能测试和评估!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息