您好,登錄后才能下訂單哦!
本文實例講述了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) + "', 'birth2" + 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程序設計有所幫助。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。