python 自带sqlite3数据库访问模块. sqlite3 以下写一个数据库访问类

 '''
2016年2月5日
描述: 操作sqlite数据库的封装
主要功能: 将sqlite数据库数据转为python对象集合
错误日志: 如果在操作过程中发生了错误,将会在当前目录下产生dblog目录,并记载. 步骤: 执行一个完整的数据操作需要:建立连接->得到游标->执行sql->分析结果
第二个步骤和ado.net不一样,游标类的作用有点类似于SqlDataReader,有方法可从中读取结果集
结果: 执行SELECT会得到一个含有Model对象的列表,对象的属性名是SQL语句查询的字段名,值是字段值
Model是一个空对象,它的属性都是动态加上去的,在得到结果集之后.
''' import os
import sqlite3
from Loggers.MyLog import MyLog
from DBA.Model import Model class SQLiteDBA:
'''操作sqlite的类'''
#
def __init__(self,connstr=None):
'''// 初始化 主要是传入连接字符串
// 1. connstr:数据库连接串.就是sqlite文件所在的路径
'''
# 连接字符串
self.__ConnStr=connstr
# 当前连接
self.__Conn=None
# 游标
self.__Cur=None #
def ExecuteQuery(self,sql,*paras,EntityClass=None,paraClass=None):
'''// 执行一个查询,返回结果集.如果没有结果或者发生了异常返回None
// 1. sql:sql语句
// 2. *paras:参数元组,列表
// 3. EntityClass:传入实体类,直接写上类名就行.需要写成命名方式EntityClass=XXX
// 4. paraClass:实体类参数 需要写成命名方式paraClass=XXX
'''
self.__OpenDB()
try:
# 执行语句
if paraClass is not None:
self.__Cur.execute(sql,paraClass.__dict__)
else:
self.__Cur.execute(sql,paras)
# 包含查出的所有记录数
data=self.__Cur.fetchall()
# 如果结果集为空
if(len(data)==0):return None ## 将结果集和列名绑定到model上. # 包含col列信息,这返回的是二维元组,每个元组的元素都是一个有七个值的元组.其中第1个值是列名.顺序和SQL语句查询列名顺序一致
colinfo=self.__Cur.description
# 建立空列表放实体对象,datalist=[]也可以
datalist=list()
if(EntityClass is None):EntityClass=Model
# 循环赋值
for row in data:
m=EntityClass()
for colindex in range(len(row)):
m.__dict__[colinfo[colindex][0]]=row[colindex]
# add m
datalist.append(m)
# 返回结果对象列表
return datalist
except sqlite3.Error as e:
MyLog.AddLog('在[ {0} ]数据库执行查询时发生异常.[{1}]'.format(self.__ConnStr,e.args[0]))
return None
finally:
self.__CloseDB() #
def ExecuteScalar(self,sql,*paras,paraClass=None):
'''
// 执行一个查询返回单个值.DBNULL或者异常都返回None
// 1. sql:sql语句
// 2. *paras:参数元组,列表
// 3. paraClass:实体类参数 需要写成命名方式paraClass=XXX
'''
self.__OpenDB()
try:
# 执行语句
if paraClass is not None:
self.__Cur.execute(sql,paraClass.__dict__)
else:
self.__Cur.execute(sql,paras)
# 包含查出的所有记录数
data=self.__Cur.fetchall()
# 如果结果集为空
if(len(data)==0):return None
# 返回单个值 数据库字符值为NULL时,或者值为空字符(要转成字符串后再判断为空)时的情况
if(data[0][0] is None):return None
if(len(str(data[0][0]))==0):return None
return data[0][0]
except sqlite3.Error as e:
MyLog.AddLog('在[ {0} ]数据库执行单值查询时发生异常.[{1}]'.format(self.__ConnStr,e.args[0]))
return None
finally:
self.__CloseDB()
#
def ExecuteNoQuery(self,sql,*paras,paraClass=None):
'''// 执行一个非查询,返回受影响的行数.如果发生异常,返回None
// 1.sql:sql语句
// 2. *paras:参数元组,列表
// 3. paraClass:实体类参数 需要写成命名方式paraClass=XXX
'''
self.__OpenDB()
try:
# 执行语句
if paraClass is not None:
self.__Cur.execute(sql,paraClass.__dict__)
else:
self.__Cur.execute(sql,paras)
# 非查询需要提交事务
cou=self.__Cur.rowcount
self.__Conn.commit()
#return self.__Cur.rowcount
return cou
except sqlite3.Error as e:
MyLog.AddLog('在[ {0} ]数据库执行非查询时发生异常.[{1}]'.format(self.__ConnStr,e.args[0]))
return None
finally:
self.__CloseDB()
#
def __OpenDB(self):
'''打开数据库连接'''
if not os.path.exists(self.__ConnStr):
MyLog.AddLog('在指定的路径[ {0} ]上没有找到数据库文件.'.format(self.__ConnStr))
try:
self.__Conn = sqlite3.connect(self.__ConnStr)
except sqlite3.Error as e:
MyLog.AddLog('打开[ {0} ]数据库失败.[{1}]'.format(self.__ConnStr,e.args[0]))
# 设置游标对象
self.__Cur=self.__Conn.cursor() #
def __CloseDB(self):
'''关闭数据库连接和游标'''
self.__Cur.close()
self.__Conn.close()

model实体对象

 class Model():
"""
2016年2月5日
实体对象.该对象没有属性,在查询之后会增加属性和值
属性名就是sql查出的字段名.值为对应的值.
对于各种数据库,这个实体类是通用的.
"""

使用示例:

 from Loggers.MyLog import MyLog
from DBA.SQLite import SQLiteDBA
# 数据库对象
db=SQLiteDBA('./database/sanguo.db')
# 实体类
class Wujiang:
def __init__(self):
self.Id=None
self.Name=None
self.WuLi=None
self.ZhiLi=None
self.Sudu=None
self.WuPin=None
self.ZhiWu=None
self.RowNumber=None # 增
caoc=Wujiang()
caoc.Name='曹操'
caoc.Sudu=165
caoc.WuLi=210
caoc.ZhiLi=235
caoc.ZhiWu='丞相'
caoc.WuPin='倚天剑'
isexist="select Id from WuJiang where Name=@name";# 查询是否已有
data=db.ExecuteScalar(isexist,caoc.Name)
if data is not None:
print("已经有了[ ",caoc.Name,' ]此次未做任何增加或修改')
else:
print('还没有添加[ ',caoc.Name,' ],已经执行增加')
sql="insert into WuJiang(Name,WuLi,ZhiLi,Sudu,WuPin,ZhiWu) values(@Name,@WuLi,@ZhiLi,@Sudu,@WuPin,@ZhiWu)"
re=db.ExecuteNoQuery(sql,paraClass=caoc)
print(re==1) # 查
print('已经执行查询',caoc.Name)
query=Wujiang()
query.Name='曹操'
datalist= db.ExecuteQuery("select * from wujiang where Name=@Name",EntityClass=Wujiang,paraClass=query)
if datalist is None:
print("没有任何数据查出来")
else:
for obj in datalist:
print(obj.__dict__)
# 改
caoc.ZhiWu='大将军'
print('已经执行修改',caoc.ZhiWu,caoc.Name)
re=db.ExecuteNoQuery("update wujiang set ZhiWu=@ZhiWu where Name=@Name",paraClass=caoc)
print(re==1)

python-整理--sqlite数据库访问的更多相关文章

  1. Python操作SQLite数据库的方法详解

    Python操作SQLite数据库的方法详解 本文实例讲述了Python操作SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite简单介绍 SQLite数据库是一款非常小巧的嵌入式开 ...

  2. [python]用Python进行SQLite数据库操作

    用Python进行SQLite数据库操作 1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~  ]: u ...

  3. Python操作sqlite数据库小节

    学习了Python操作sqlite数据库,做一个小结,以备后用. import sqlite3import os# 进行数据库操作时,主要是参数如何传输try:# 链接数据库conn=sqlite3. ...

  4. 用Python进行SQLite数据库操作

    简单的介绍 SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身.它是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经 ...

  5. python操作sqlite数据库

    root@cacti:~/box# cat convert.py #!/usr/bin/env python import sqlite3,time,rrdtool,os def boxstatus( ...

  6. python 操作sqlite数据库

    '''SQLite数据库是一款非常小巧的嵌入式开源数据库软件,也就是说 没有独立的维护进程,所有的维护都来自于程序本身. 在python中,使用sqlite3创建数据库的连接,当我们指定的数据库文件不 ...

  7. Python 操作 SQLite 数据库

    写在之前 SQLite 是一个小型的关系型数据库,它最大的特点在于不需要单独的服务.零配置.我们在之前讲过的两个数据库,不管是 MySQL 还是 MongoDB,都需要我们安装.安装之后,然后运行起来 ...

  8. Python 操作sqlite数据库及保存查询numpy类型数据(二)

    # -*- coding: utf-8 -*- ''' Created on 2019年3月6日 @author: Administrator ''' import sqlite3 import nu ...

  9. Python 操作sqlite数据库及保存查询numpy类型数据(一)

    # -*- coding: utf-8 -*- ''' Created on 2019年3月6日 @author: Administrator ''' import sqlite3 import nu ...

随机推荐

  1. 移动web前端的一些硬技能(一)关于移动设备

    移动端web其实也就是小尺寸触摸屏设备的web,其中包含了两个词——1.小尺寸设备:2.触摸屏.能把这两个问题给解决掉,就已经是一个基本合格的移动web前端开发工程师了.对于前端工程师来说,前路漫漫, ...

  2. oracle的resetlogs机制浅析

    oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用?它的原理 ...

  3. KMP算法总♂结

    讲KM♂P算法之前,我们先讲一个故♂事. 有一天,sgg给了老obo一封信和一个单词,并给他一个任务:找出这封信出现了多少个单词,然后在规定时间内告诉他. 碰到这个问题,老obo会怎么做呢? 首先最直 ...

  4. AltiumDesignerSummer9Build9.3.1.19182破解图文教程

    一.下载 AltiumDesignerSummer9Build9.3.1.19182 下载地址 http://www.verycd.com/topics/2769819/ 二.安装 一路确定啥的傻瓜式 ...

  5. Android通过HTTP协议实现上传文件数据

    SocketHttpRequester.java package cn.itcast.utils; import java.io.BufferedReader; import java.io.Byte ...

  6. Page Controller页面控制器实现

    A Page Controller is one object or file declaration designed to handle the request for one logical w ...

  7. myeclipse中控制台日志比实际晚8小时解决方法及java日志处理

    今天终于忍不住要解决myeclipse控制台中日志显示比实际晚8小时的问题,开始以为myeclipse编辑器时间问题,后来想想不对,myeclipse控制台打印的是tomcat的日志,随后以为是log ...

  8. WiEngine+Eclipse+CDT+Sequoyah实现c++编程智能感知提示

    经过一段时间的摸索,我初步肯定自己基于WiEngine平台和C++开发跨Android/iPhone游戏的最佳(至少目前)环境为: Eclipse+CDT+Sequoyah 第一,JAVA代码调试技术 ...

  9. vijos1777 引水入城

    描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N行M列的矩形,其中每个格子都代表一座城市,每座城市都有一个海拔高度. 为了使居民们都尽可能 ...

  10. Javascript或jQuery方法产生任意随机整数

    方法1:javascritp方法 1 2 3 4 5 6 //随机数    function diu_Randomize(b,e){        if(!b && b!=0 || ! ...