python sqlite多執行緒程式設計
阿新 • • 發佈:2019-02-10
- 首先,定義一個類,操作某資料庫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())
- 定義資料庫連線相關的攔截器.在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
- 使用攔截器,攔截save方法
@conn_trans() def save(self,obj,conn=None): ''' 儲存資料 ''' cu = conn.cursor() cu.execute(obj.to_insert_sql())