python 自带sqlite3数据库访问模块. sqlite3 以下写一个数据库访问类
1 ''' 2 2016年2月5日 3 描述: 操作sqlite数据库的封装 4 主要功能: 将sqlite数据库数据转为python对象集合 5 错误日志: 如果在操作过程中发生了错误,将会在当前目录下产生dblog目录,并记载. 6 7 步骤: 执行一个完整的数据操作需要:建立连接->得到游标->执行sql->分析结果 8 第二个步骤和ado.net不一样,游标类的作用有点类似于SqlDataReader,有方法可从中读取结果集 9 结果: 执行SELECT会得到一个含有Model对象的列表,对象的属性名是SQL语句查询的字段名,值是字段值 10 Model是一个空对象,它的属性都是动态加上去的,在得到结果集之后. 11 ''' 12 13 import os 14 import sqlite3 15 from Loggers.MyLog import MyLog 16 from DBA.Model import Model 17 18 class SQLiteDBA: 19 '''操作sqlite的类''' 20 # 21 def __init__(self,connstr=None): 22 '''// 初始化 主要是传入连接字符串 23 // 1. connstr:数据库连接串.就是sqlite文件所在的路径 24 ''' 25 # 连接字符串 26 self.__ConnStr=connstr 27 # 当前连接 28 self.__Conn=None 29 # 游标 30 self.__Cur=None 31 32 # 33 def ExecuteQuery(self,sql,*paras,EntityClass=None,paraClass=None): 34 '''// 执行一个查询,返回结果集.如果没有结果或者发生了异常返回None 35 // 1. sql:sql语句 36 // 2. *paras:参数元组,列表 37 // 3. EntityClass:传入实体类,直接写上类名就行.需要写成命名方式EntityClass=XXX 38 // 4. paraClass:实体类参数 需要写成命名方式paraClass=XXX 39 ''' 40 self.__OpenDB() 41 try: 42 # 执行语句 43 if paraClass is not None: 44 self.__Cur.execute(sql,paraClass.__dict__) 45 else: 46 self.__Cur.execute(sql,paras) 47 # 包含查出的所有记录数 48 data=self.__Cur.fetchall() 49 # 如果结果集为空 50 if(len(data)==0):return None 51 52 ## 将结果集和列名绑定到model上. 53 54 # 包含col列信息,这返回的是二维元组,每个元组的元素都是一个有七个值的元组.其中第1个值是列名.顺序和SQL语句查询列名顺序一致 55 colinfo=self.__Cur.description 56 # 建立空列表放实体对象,datalist=[]也可以 57 datalist=list() 58 if(EntityClass is None):EntityClass=Model 59 # 循环赋值 60 for row in data: 61 m=EntityClass() 62 for colindex in range(len(row)): 63 m.__dict__[colinfo[colindex][0]]=row[colindex] 64 # add m 65 datalist.append(m) 66 # 返回结果对象列表 67 return datalist 68 except sqlite3.Error as e: 69 MyLog.AddLog('在[ {0} ]数据库执行查询时发生异常.[{1}]'.format(self.__ConnStr,e.args[0])) 70 return None 71 finally: 72 self.__CloseDB() 73 74 # 75 def ExecuteScalar(self,sql,*paras,paraClass=None): 76 ''' 77 // 执行一个查询返回单个值.DBNULL或者异常都返回None 78 // 1. sql:sql语句 79 // 2. *paras:参数元组,列表 80 // 3. paraClass:实体类参数 需要写成命名方式paraClass=XXX 81 ''' 82 self.__OpenDB() 83 try: 84 # 执行语句 85 if paraClass is not None: 86 self.__Cur.execute(sql,paraClass.__dict__) 87 else: 88 self.__Cur.execute(sql,paras) 89 # 包含查出的所有记录数 90 data=self.__Cur.fetchall() 91 # 如果结果集为空 92 if(len(data)==0):return None 93 # 返回单个值 数据库字符值为NULL时,或者值为空字符(要转成字符串后再判断为空)时的情况 94 if(data[0][0] is None):return None 95 if(len(str(data[0][0]))==0):return None 96 return data[0][0] 97 except sqlite3.Error as e: 98 MyLog.AddLog('在[ {0} ]数据库执行单值查询时发生异常.[{1}]'.format(self.__ConnStr,e.args[0])) 99 return None 100 finally: 101 self.__CloseDB() 102 # 103 def ExecuteNoQuery(self,sql,*paras,paraClass=None): 104 '''// 执行一个非查询,返回受影响的行数.如果发生异常,返回None 105 // 1.sql:sql语句 106 // 2. *paras:参数元组,列表 107 // 3. paraClass:实体类参数 需要写成命名方式paraClass=XXX 108 ''' 109 self.__OpenDB() 110 try: 111 # 执行语句 112 if paraClass is not None: 113 self.__Cur.execute(sql,paraClass.__dict__) 114 else: 115 self.__Cur.execute(sql,paras) 116 # 非查询需要提交事务 117 cou=self.__Cur.rowcount 118 self.__Conn.commit() 119 #return self.__Cur.rowcount 120 return cou 121 except sqlite3.Error as e: 122 MyLog.AddLog('在[ {0} ]数据库执行非查询时发生异常.[{1}]'.format(self.__ConnStr,e.args[0])) 123 return None 124 finally: 125 self.__CloseDB() 126 # 127 def __OpenDB(self): 128 '''打开数据库连接''' 129 if not os.path.exists(self.__ConnStr): 130 MyLog.AddLog('在指定的路径[ {0} ]上没有找到数据库文件.'.format(self.__ConnStr)) 131 try: 132 self.__Conn = sqlite3.connect(self.__ConnStr) 133 except sqlite3.Error as e: 134 MyLog.AddLog('打开[ {0} ]数据库失败.[{1}]'.format(self.__ConnStr,e.args[0])) 135 # 设置游标对象 136 self.__Cur=self.__Conn.cursor() 137 138 # 139 def __CloseDB(self): 140 '''关闭数据库连接和游标''' 141 self.__Cur.close() 142 self.__Conn.close()
model实体对象
1 class Model(): 2 """ 3 2016年2月5日 4 实体对象.该对象没有属性,在查询之后会增加属性和值 5 属性名就是sql查出的字段名.值为对应的值. 6 对于各种数据库,这个实体类是通用的. 7 """
使用示例:
1 from Loggers.MyLog import MyLog 2 from DBA.SQLite import SQLiteDBA 3 # 数据库对象 4 db=SQLiteDBA('./database/sanguo.db') 5 # 实体类 6 class Wujiang: 7 def __init__(self): 8 self.Id=None 9 self.Name=None 10 self.WuLi=None 11 self.ZhiLi=None 12 self.Sudu=None 13 self.WuPin=None 14 self.ZhiWu=None 15 self.RowNumber=None 16 17 # 增 18 caoc=Wujiang() 19 caoc.Name='曹操' 20 caoc.Sudu=165 21 caoc.WuLi=210 22 caoc.ZhiLi=235 23 caoc.ZhiWu='丞相' 24 caoc.WuPin='倚天剑' 25 isexist="select Id from WuJiang where Name=@name";# 查询是否已有 26 data=db.ExecuteScalar(isexist,caoc.Name) 27 if data is not None: 28 print("已经有了[ ",caoc.Name,' ]此次未做任何增加或修改') 29 else: 30 print('还没有添加[ ',caoc.Name,' ],已经执行增加') 31 sql="insert into WuJiang(Name,WuLi,ZhiLi,Sudu,WuPin,ZhiWu) values(@Name,@WuLi,@ZhiLi,@Sudu,@WuPin,@ZhiWu)" 32 re=db.ExecuteNoQuery(sql,paraClass=caoc) 33 print(re==1) 34 35 # 查 36 print('已经执行查询',caoc.Name) 37 query=Wujiang() 38 query.Name='曹操' 39 datalist= db.ExecuteQuery("select * from wujiang where Name=@Name",EntityClass=Wujiang,paraClass=query) 40 if datalist is None: 41 print("没有任何数据查出来") 42 else: 43 for obj in datalist: 44 print(obj.__dict__) 45 # 改 46 caoc.ZhiWu='大将军' 47 print('已经执行修改',caoc.ZhiWu,caoc.Name) 48 re=db.ExecuteNoQuery("update wujiang set ZhiWu=@ZhiWu where Name=@Name",paraClass=caoc) 49 print(re==1)