python使用数据库池连接mysql

需要库
1、DBUtils
2、pymysql
说明:DBUtils 暂时不支持Python3

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

说明:
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 代表返回一个错误; 其他代表阻塞直到连接数减少,连接被分配)
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 实现数据库连接使用完后自动关闭。

你可能感兴趣的:(Python,mysql)