1. 程式人生 > >python sqlite多執行緒程式設計

python sqlite多執行緒程式設計

  1. 首先,定義一個類,操作某資料庫test表的增.刪.查,命名為testDao,哦,no!這名命名太狗血了吧。
    import threading
    import os,sqlite3
    class Dao(object):
        '''
        資料持久化處理類
        '''
        
        def __init__(self,path,name='',*args,**kwargs):
            '''
            初始化工作...
            '''
            self.lock = threading.RLock() #鎖
            self.name = name
            self.path = path #資料庫連線引數
            db_path = self.path[:self.path.rfind(os.sep)]
            if os.path.exists(db_path):
                os.makedirs(db_path)
             
        def get_conn(self):
            '''
            建立連線,為什麼不能設定為例項成員?自己想想,--
            '''
            conn = sqlite3.connect(self.path)
            return conn
        
        def conn_close(self,conn=None):
            '''
            操作完,關掉連線
            '''
            conn.close()
            
        def save(self,obj,conn=None):
            '''
            儲存資料
            '''
            cu = conn.cursor()
            cu.execute(obj.to_insert_sql())
            

  2. 定義資料庫連線相關的攔截器.在func呼叫前連線資料庫,func呼叫結束提高事務並關閉連線.
    def conn_trans(func):
        '''
        資料庫連線相關的攔截器.在func呼叫前連線資料庫,func呼叫結束提高事務並關閉連線.
        '''
        def connection(self,*args,**kwargs):
            self.lock.acquire()
            conn = self.get_conn()
            kwargs['conn'] = conn
            rs = func(self,*args,**kwargs)
            self.conn_close(conn)
            self.lock.release()
            return rs
        return connection

  3. 使用攔截器,攔截save方法
    @conn_trans()  
        def save(self,obj,conn=None):
            '''
            儲存資料
            '''
            cu = conn.cursor()
            cu.execute(obj.to_insert_sql())