本文实例讲述了Python带动态参数功能的sqlite工具类。分享给大家供大家参考,具体如下:
最近在弄sqlite和python
在网上参考各教程后,结合以往java jdbc数据库工具类写出以下python连接sqlite的工具类
写得比较繁琐 主要是想保留一种类似java的Object…args动态参数写法 并兼容数组/list方式传递不定个数参数 并且返回值是List形式 dict字典 以便和JSON格式互相转换
在python中有一些区别 经过该工具类封装之后可以有以下用法:
db.executeQuery("s * f t w id=", "id01", "name01");//动态参数形式 db.executeQuery("s * f t w id=", ("id01", "name01"));//tuple元组式 等价上面 括号可省略 db.executeQuery("s * f t w id=", ["id01", "name01"]);//list数组形式
完整Python代码如下:
#!/usr/bin/python #-*- coding:utf-8 -*- import sqlite3 import os # # 连接数据库帮助类 # eg: # db = database() # count,listRes = db.executeQueryPage("select * from student where id=", 2, 10, "id01", "%name%") # listRes = db.executeQuery("select * from student where id=", "id01", "%name%") # db.execute("delete from student where id=", "id01") # count = db.getCount("select * from student ") # db.close() # class database : dbfile = "sqlite.db" memory = ":memory:" conn = None showsql = True def __init__(self): self.conn = self.getConn() #输出工具 def out(self, outStr, *args): if(self.showsql): for var in args: if(var): outStr = outStr + ", " + str(var) print("db. " + outStr) return #获取连接 def getConn(self): if(self.conn is None): conn = sqlite3.connect(self.dbfile) if(conn is None): conn = sqlite3.connect(self.memory) if(conn is None): print("dbfile : " + self.dbfile + " is not found && the memory connect error ! ") else: conn.row_factory = self.dict_factory #字典解决方案 self.conn = conn self.out("db init conn ok ! ") else: conn = self.conn return conn #字典解决方案 def dict_factory(self, cursor, row): d = {} for idx, col in enumerate(cursor.description): d[col[0]] = row[idx] return d #关闭连接 def close(self, conn=None): res = 2 if(not conn is None): conn.close() res = res - 1 if(not self.conn is None): self.conn.close() res = res - 1 self.out("db close res : " + str(res)) return res #加工参数tuple or list 获取合理参数list #把动态参数集合tuple转为list 并把单独的传递动态参数list从tuple中取出作为参数 def turnArray(self, args): #args (1, 2, 3) 直接调用型 exe("select x x", 1, 2, 3) #return [1, 2, 3] <- list(args) #args ([1, 2, 3], ) list传入型 exe("select x x",[ 1, 2, 3]) len(args)=1 && type(args[0])=list #return [1, 2, 3] if(args and len(args) == 1 and (type(args[0]) is list) ): res = args[0] else: res = list(args) return res #分页查询 查询page页 每页num条 返回 分页前总条数 和 当前页的数据列表 count,listR = db.executeQueryPage("select x x",1,10,(args)) def executeQueryPage(self, sql, page, num, *args): args = self.turnArray(args) count = self.getCount(sql, args) pageSql = "select * from ( " + sql + " ) limit 5 offset 0 " #args.append(num) #args.append(int(num) * (int(page) - 1) ) self.out(pageSql, args) conn = self.getConn() cursor = conn.cursor() listRes = cursor.execute(sql, args).fetchall() return (count, listRes) #查询列表array[map] eg: [{'id': u'id02', 'birth': u'birth01', 'name': u'name02'}, {'id': u'id03', 'birth': u'birth01', 'name': u'name03'}] def executeQuery(self, sql, *args): args = self.turnArray(args) self.out(sql, args) conn = self.getConn() cursor = conn.cursor() res = cursor.execute(sql, args).fetchall() return res #执行sql或者查询列表 并提交 def execute(self, sql, *args): args = self.turnArray(args) self.out(sql, args) conn = self.getConn() cursor = conn.cursor() #sql占位符 填充args 可以是tuple(1, 2)(动态参数数组) 也可以是list[1, 2] list(tuple) tuple(list) res = cursor.execute(sql, args).fetchall() conn.commit() #self.close(conn) return res #查询列名列表array[str] eg: ['id', 'name', 'birth'] def getColumnNames(self, sql, *args): args = self.turnArray(args) self.out(sql, args) conn = self.getConn() if(not conn is None): cursor = conn.cursor() cursor.execute(sql, args) res = [tuple[0] for tuple in cursor.description] return res #查询结果为单str eg: 'xxxx' def getString(self, sql, *args): args = self.turnArray(args) self.out(sql, args) conn = self.getConn() cursor = conn.cursor() listRes = cursor.execute(sql, args).fetchall() columnNames = [tuple[0] for tuple in cursor.description] #print(columnNames) res = "" if(listRes and len(listRes) >= 1): res = listRes[0][columnNames[0]] return res #查询记录数量 自动附加count(*) eg: 3 def getCount(self, sql, *args): args = self.turnArray(args) sql = "select count(*) cc from ( " + sql + " ) " resString = self.getString(sql, args) res = 0 if(resString): res = int(resString) return res ####################################测试 def main(): db = database() db.execute( ''' create table if not exists student( id text primary key, name text not null, birth text ) ''' ) for i in range(10): db.execute("insert into student values('id1" + str(i) + "', 'name1" + str(i) + "', 'birth1" + str(i) + "')") db.execute("insert into student values('id01', 'name01', 'birth01')") db.execute("insert into student values('id02', 'name02', 'birth01')") db.execute("insert into student values('id03', 'name03', 'birth01')") print(db.getColumnNames("select * from student")) print(db.getCount("select * from student " )) print(db.getString("select name from student where id = ", "id02" )) print(db.executeQuery("select * from student where 1=", 1, 2 )) print(db.executeQueryPage("select * from student where id like ", 1, 5, "id0%")) db.execute("update student set name='nameupdate' where id = ", "id02") db.execute("delete from student where id = ", "id01") db.close() if __name__ == '__main__': main()
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python操作SQLite数据库技巧总结》、《Python常见数据库操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
2024年11月21日
2024年11月21日
- 罗大佑-无法盗版的青春套装版10CD【WAV】
- 张学友《意乱情迷》蜚声环球 2024 [WAV+CUE][1G]
- 柏菲《好歌30年特别版2CD》最好听的影视歌曲[低速原抓WAV+CUE][1G]
- 张学友《世纪10星·永恒篇》香港版[WAV+CUE][1G]
- 模拟之声慢刻CD《刘德海.琵琶独奏精逊【低速原抓WAV+CUE】
- Jamettone-18052023—improv(EDit)(2024)【FLAC】
- 【索尼精芽20首最棒的苏格兰歌曲集【FLAC】
- 池约翰C.J《少年白马醉春风2 动画原声带》[320K/MP3][26.67MB]
- 池约翰C.J《少年白马醉春风2 动画原声带》[FLAC/分轨][144.13MB]
- 陈致逸《幻想乐园 Fantasyland》[320K/MP3][120.54MB]
- 席卷全球最红舞曲《火辣辣DJ[英文版]》[DTS-WAV]
- 群星-席卷全球最红舞曲《火辣辣DJ中文版》【WAV】
- 模拟之声慢刻CD《声入人心[年度发烧人声严选]》[低速原抓WAV+CUE]
- 陈致逸《幻想乐园 Fantasyland》[FLAC/分轨][554.27MB]
- Rhymist / LusciousBB《年轮》[320K/MP3][76.52MB]