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


Posted in Python onMay 26, 2018

本文实例讲述了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 sqlite3
import 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 相关文章推荐
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
浅谈Python 字符串格式化输出(format/printf)
Jul 21 Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 Python
Python设置在shell脚本中自动补全功能的方法
Jun 25 Python
利用Python求阴影部分的面积实例代码
Dec 05 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
详解Python装饰器
Mar 25 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
Python中类似于jquery的pyquery库用法分析
Dec 02 Python
PyTorch中topk函数的用法详解
Jan 02 Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 Python
Python中的__init__作用是什么
Jun 09 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 #Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 #Python
Python多重继承的方法解析执行顺序实例分析
May 26 #Python
Python多继承顺序实例分析
May 26 #Python
Python装饰器用法实例总结
May 26 #Python
python 脚本生成随机 字母 + 数字密码功能
May 26 #Python
Python高级用法总结
May 26 #Python
You might like
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
Codeigniter框架实现获取分页数据和总条数的方法
2014/12/05 PHP
php提取微信账单的有效信息
2018/10/01 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
JQuery实现动态适时改变字体颜色的方法
2015/03/10 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
jQuery控制div实现随滚动条滚动效果
2016/06/07 Javascript
最全面的JS倒计时代码
2016/09/17 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
关于Vue的路由权限管理的示例代码
2018/03/06 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
Django+Vue跨域环境配置详解
2018/07/06 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
jQuery 选择器用法基础入门示例
2020/01/04 jQuery
[56:58]VP vs Optic 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python求解平方根的方法
2015/03/11 Python
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
12个步骤教你理解Python装饰器
2019/07/01 Python
如何使用python传入不确定个数参数
2020/02/18 Python
django-csrf使用和禁用方式
2020/03/13 Python
python基于socket函数实现端口扫描
2020/05/28 Python
Python偏函数Partial function使用方法实例详解
2020/06/17 Python
机械电子工程专业推荐信范文
2013/11/20 职场文书
管理部副部长岗位职责范文
2014/03/09 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
使用python绘制横竖条形图
2022/04/21 Python
数据设计之权限的实现
2022/08/05 MySQL