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 相关文章推荐
python抓取京东价格分析京东商品价格走势
Jan 09 Python
利用python实现数据分析
Jan 11 Python
Python Socket传输文件示例
Jan 16 Python
Windows系统下多版本pip的共存问题详解
Oct 10 Python
django开发教程之利用缓存文件进行页面缓存的方法
Nov 10 Python
Python实现翻转数组功能示例
Jan 12 Python
python之matplotlib学习绘制动态更新图实例代码
Jan 23 Python
详解Python做一个名片管理系统
Mar 14 Python
PyTorch的深度学习入门之PyTorch安装和配置
Jun 27 Python
简单了解Python生成器是什么
Jul 02 Python
如何基于Python实现word文档重新排版
Sep 29 Python
python机器学习创建基于规则聊天机器人过程示例详解
Nov 02 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
Zend引擎的发展 [15]
2006/10/09 PHP
比较详细PHP生成静态页面教程
2012/01/10 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
php自动加载方式集合
2016/04/04 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
css3实现背景模糊的三种方式
2021/03/09 HTML / CSS
Javascript里使用Dom操作Xml
2006/09/20 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
简单实现JS上传图片预览功能
2017/04/14 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
2017/10/20 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
Nodejs中的JWT和Session的使用
2018/08/21 NodeJs
原生JavaScript实现弹幕组件的示例代码
2020/10/12 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
简单谈谈python的反射机制
2016/06/28 Python
解决Python selenium get页面很慢时的问题
2019/01/30 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
django model通过字典更新数据实例
2020/04/01 Python
css3的图形3d翻转效果应用示例
2014/04/08 HTML / CSS
大学生年度自我鉴定
2013/10/31 职场文书
母婴店促销方案
2014/03/05 职场文书
建筑结构施工求职信
2014/07/11 职场文书
公路施工安全责任书
2015/05/08 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
MySQL时区造成时差问题
2022/04/13 MySQL
Python实现数据的序列化操作详解
2022/07/07 Python