侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python带动态参数功能的sqlite工具类

Python  /  管理员 发布于 7年前   162

本文实例讲述了Python带动态参数功能的sqlite工具类。分享给大家供大家参考,具体如下:

最近在弄sqlite和python

在网上参考各教程后,结合以往java jdbc数据库工具类写出以下python连接sqlite的工具类

写得比较繁琐 主要是想保留一种类似java的Object…args动态参数写法 并兼容数组/list方式传递不定个数参数 并且返回值是List形式 dict字典 以便和JSON格式互相转换

在python中有一些区别 经过该工具类封装之后可以有以下用法:

db.executeQuery("s * f t w id=? and name=?", "id01", "name01");//动态参数形式db.executeQuery("s * f t w id=? and name=?", ("id01", "name01"));//tuple元组式 等价上面 括号可省略db.executeQuery("s * f t w id=? and name=?", ["id01", "name01"]);//list数组形式

完整Python代码如下:

#!/usr/bin/python#-*- coding:utf-8 -*-  import sqlite3import os ## 连接数据库帮助类# eg:#  db = database()#  count,listRes = db.executeQueryPage("select * from student where id=? and name like ? ", 2, 10, "id01", "%name%")#  listRes = db.executeQuery("select * from student where id=? and name like ? ", "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=? and 2=? ", 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 = ? or 1=1 ", "id01")  db.close()if __name__ == '__main__':  main()

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python操作SQLite数据库技巧总结》、《Python常见数据库操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。


  • 上一条:
    Python基于生成器迭代实现的八皇后问题示例
    下一条:
    通过Py2exe将自己的python程序打包成.exe/.app的方法
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客