Python带动态参数功能的sqlite工具类
作者:A_辉 发布时间:2022-10-02 14:05:15
标签:Python,sqlite工具类
本文实例讲述了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程序设计有所帮助。
来源:https://blog.csdn.net/u014303844/article/details/78963812


猜你喜欢
- asp连接sql 第一种写法: 代码如下: MM_conn_STRING = "Driver={SQL Server};serv
- 但凡介绍数据库连接池的文章,都会说“数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理
- 废话不多说,先给大家展示一下效果图,如果大家感觉不错,请参考实现代码。效果图如下所示:代码如下所示:<!DOCTYPE html PU
- 目标在本章中,将学习利用calib3d模块在图像中创建一些3D效果基础在上一节相机校准中,了解了相机矩阵、失真系数等。给定图案图像,可以利用
- http://pyhdfs.readthedocs.io/en/latest/1:安装由于是windows环境(linux其实也一样),只要
- 在设计主键的时候往往需要考虑以下几点: 1.无意义性:此处无意义是从用户的角度来定义的。这种无意义在一定程度上也会减少数据库的信息冗余。常常
- 我是在做行人检测中需要将一段视频变为图片数据集,然后想将视频每秒钟的图片提取出来。语言:python所需要的库:cv2,numpy (自行安
- 案例故事:大部分带彩色屏幕的终端设备,不管是手机,车机,电视等等,都需要涉及图片的显示,作为一名专业的多媒体测试人员,我们需要一堆的规范化标
- 为什么使用事务 当对多个表进行更新的时候,某条执行失败。为了保持数据的完整性,需要使用事务回滚。 显示设置事务 代码如下:beg
- 有的时候,我们为了保持网页的美观,需要将较长的文字在一定长度时截断。比如我们希望在列表中显示文章标题的前15个字,那么一个这样的标题:“rs
- 前言最近在写一个移动端的地图项目,也是首次完整的去了解百度地图api,这篇博客会手把手的教你如何使用百度地图api和一些常见问题,后续我也会
- flash param参数和属性下列标记属性和参数描述了由“发布”命令创建的 HTML 代码。在编写自己的用于显示 Flash 内容的 HT
- 1.下载pyinstaller并解压(可以去官网下载最新版):https://github.com/pyinstaller/pyinstal
- 1、删除目录及目录下所有的文件2、删除目录下的所有文件但目录结构保留3、删除指定文件代码如下/** +-------------------
- 本文介绍了手把手教你如何安装Pycharm,分享给大家,具体如下:1、首先去Pycharm官网,或者直接输入网址:http://www.je
- 用MYSQL 5.7.9 作为ZABBIX 2.4.7 的监控数据库. 前段时间开启了慢查询日志, 后来发现慢查询日志膨胀到了700M查看最
- 简介前几天捣鼓了一下Ubuntu,正是想用一下我旧电脑上的N卡,可以用GPU来跑代码,体验一下多核的快乐。还好我这破电脑也是支持Cuda的:
- <? //很好用的PHP数据库类,三、四句代码搞定一个表的操作,无论这个表字段有多复杂。 //此类多次大量用在大型网站程序的开发上,效
- MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,增加默认MYSQL连接数的方法有两
- 主要实现的部分是利用NameGeneratorType读入系列图像,见头文件#include "itkNumericSeriesF