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 client使用http post 到server端的代码
Feb 10 Python
Python中使用gzip模块压缩文件的简单教程
Apr 08 Python
python使用自定义user-agent抓取网页的方法
Apr 15 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
小小聊天室Python代码实现
Aug 17 Python
python实现发送邮件及附件功能
Mar 02 Python
python psutil库安装教程
Mar 19 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
May 18 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
使用python os模块复制文件到指定文件夹的方法
Aug 22 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 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获取Google AJAX Search API 数据的代码
2010/03/12 PHP
PHP中soap的用法实例
2014/10/24 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
类似CSDN图片切换效果脚本
2009/09/17 Javascript
一些技巧性实用js代码小结
2009/10/14 Javascript
移动节点的jquery代码
2014/01/13 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
2015/12/10 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
js微信应用场景之微信音乐相册案例分享
2017/08/11 Javascript
Vue组件创建和传值的方法
2018/08/17 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
微信小程序通过一个json实现分享朋友圈图片
2019/09/03 Javascript
jQuery实现增删改查
2020/12/22 jQuery
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
python调用百度语音REST API
2018/08/30 Python
python爬取微信公众号文章的方法
2019/02/26 Python
Python csv模块使用方法代码实例
2019/08/29 Python
Python实现EM算法实例代码
2020/10/04 Python
Html5元素及基本语法详解
2016/08/02 HTML / CSS
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
移动通信专业自荐信范文
2013/11/12 职场文书
《画》教学反思
2014/04/14 职场文书
水电维修专业推荐信
2014/09/06 职场文书
实习工作表现评语
2014/12/31 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
日本读研:怎样写好一篇日本研究计划书?
2019/07/15 职场文书
《工作是最好的修行》读后感3篇
2019/12/13 职场文书