首页 > 代码库 > 自己封装的python——DBUtilS,大家多多指教

自己封装的python——DBUtilS,大家多多指教

这个Utils用了第三方库DBUtils,我经过又一层了简单封装,自认为还是挺简洁的,只实现了增删改查


import MySQLdb,functools

from DBUtils.PooledDB import PooledDB
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 
sys.path.append('../')
import readConfig 

__author__='xiezhaodong at 2014-8-14'

class Mysql(object):
	'''
	This method can get the connection pool and a connection object
	'''
	conn=None
	__pool=None
	def __init__(self):
		
		self.__pool=self.__initPool()
		self.conn=self.getConn()
	@staticmethod
	def __initPool():
		'''
		A static method cannot access the instance variables
		'''
		if Mysql.__pool is None:


			try:
				print 'install pool'
				__pool=PooledDB(creator=MySQLdb,maxusage=readConfig.maxusage,mincached=readConfig.mincached,maxcached=readConfig.maxcached, db=readConfig.db, host=readConfig.host, user=readConfig.user, passwd=readConfig.passwd, charset=readConfig.charset,port=readConfig.port)
				return __pool
			except Exception,e :
				print 'create pool default',e
				return None		
	def getConn(self):
		'''
		Get a link from the connection pool
		'''
		#print 'get connection from pool'
		if self.__pool is None:
			return None
		return self.__pool.connection()
init=Mysql()
class _ConnetionCtx(object):
	'''
	Ctx get connection and  exit close connection
	can user with _ConnetionCtx():

	'''
   
	def __enter__(self):
		global init
		self.mysql=init#Load the MySQL object get links
		self.conn=None
		self.clean=False
		if self.conn is None:
			#print 'connect'
			self.conn=self.mysql.getConn()
			self.clean=True
			#print self.conn,'---------connection'

		return self
	def __exit__(self,exc_type,exc_value,traceback):
		
		if self.conn is not None and self.clean is True:
			'''
			Release the connection object
			'''
			#print 'close conn'
			self.conn.close()
			self.conn=None

def ConnectionCtxController(func):
	'''
	decorator to get connection and release connection
	The CTX parameter passed to the function

	'''

	@functools.wraps(func)
	def _wrapper(**args):
		with _ConnetionCtx() as Ctx:
			return func(Ctx=Ctx,**args)
	return _wrapper

@ConnectionCtxController
def select(Ctx,sql,kw):
	'''	get select rows
		Returns None if the said no database links, return () said there is no corresponding data
	'''
	sql=sql.replace('?','%s')
	conn=Ctx.conn
	result=None
	if conn is None:
		'''
		no conn
		'''

		return None
	else:
		'''have conn'''
		try:
			cur=conn.cursor()
			cur.execute(sql,kw)
			result=cur.fetchall()
		except Exception ,e:
			print 'select default',e
			return None
		finally:	
			cur.close()
		return result
@ConnectionCtxController
def CRUDExceptSelect(Ctx,sql,kw,batch=False):
	'''
	This method can add, delete, modify, the default batch is False if True will use batch SQL statements, 
	the return value is None for no connection or the SQL is abnormal, 
	the other back value represents the number of successful execution

	'''
	sql=sql.replace('?','%s')
	conn=Ctx.conn
	row_succcess=None
	if conn is None:
		return None
	else:
		cur=None
		try:
			cur=conn.cursor()
			if batch:
				row_succcess=cur.executemany(sql,kw)				
			else:
				row_succcess=cur.execute(sql,kw)
		except Exception, e:
			conn.rollback()
			print 'insetr default',e
		finally:
			if cur is not None:
				print 'close cur'
				cur.close()
			conn.commit()
		#
	return row_succcess
github地址:https://github.com/xiexiaodong/blog/blob/master/python-db.py



config

[db]  
db_host=sqld.duapp.com
db_port=4050
db_user=youruser
db_pass=yourpassword
maxusage=10
mincached=10
maxcached=100
db=uWKDOxUdHCujVdsrCjjY
charset=utf8
[concurrent]  
thread=10 
processor=20 

readconfig

import ConfigParser,string,os,sys
'''
reload config
'''
class config(object):
	def __init__(self,path='./config.ini'):
		self.path=path
		self.cf=ConfigParser.ConfigParser()
		#print self.cf,'cf'
		try:
			self.cf.read(self.path)
			self.section=self.cf.sections()
		except Exception,e:
			print e,'exception read'
		#print 'start',self.section
	def get(self,field,key):
		result=''
		try:
			result=self.cf.get(field,key)
			
		except Exception,e:
			print e,'2'
			result=''
		return result
	def getint(self,field,key):
		result=''
		try:
			result=self.cf.getint(field,key)
			
		except Exception,e:
			print e,'2'
			result=''
		return result

config=config()
host=config.get('db','db_host')
port=config.getint('db','db_port')
user=config.get('db','db_user')
passwd=config.get('db','db_pass')
maxusage=config.getint('db','maxusage')
mincached=config.getint('db','mincached')
maxcached=config.getint('db','maxcached')
db=config.get('db','db')
charset=config.get('db','charset')


自己封装的python——DBUtilS,大家多多指教