这个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')
时间: 2024-10-05 09:10:01