zoukankan      html  css  js  c++  java
  • python-整理--sqlite数据库访问

    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)
  • 相关阅读:
    【以前的空间】《用单调性优化动态规划》
    【以前的空间】倍增
    【以前的空间】BIT的两个小小运用
    【以前的空间】bzoj1009 [HNOI2008]GT考试
    【以前的空间】斜率优化的一点点总结
    【以前的空间】bzoj 1227 [SDOI2009]虔诚的墓主人
    【以前的空间】bzoj 1072 [SCOI2007]排列perm
    【以前的空间】bzoj 1052 [HAOI2007]覆盖问题
    【以前的空间】bzoj [ZJOI2007]棋盘制作
    Notepad++使用技巧
  • 原文地址:https://www.cnblogs.com/mirrortom/p/5198648.html
Copyright © 2011-2022 走看看