【Python】Mysql資料庫操作類
在《【Python】Windows平臺下Python、Pydev連線Mysql資料庫》(點選開啟連結)中介紹瞭如何為Python與Eclipse中的Pydev環境增加Mysql的操作能力。
下面為Python的Mysql資料庫操作設定一個類,以後每次使用就不會將程式碼寫得七零八落了,儘管Python是簡直有愛的指令碼語言,但還是要將程式碼寫得儘可能好看。
還是完成《【Java】利用單例模式、可變引數優化Java操作Mysql資料庫、JDBC程式碼的寫作》(點選開啟連結)中的事情,同樣在test資料庫中有張用爛的usertable表:
裡面有11條資料如下:
我們同樣要在Python完成對這張表的增刪改查。
只是Python中所有類成員沒有公有私有的概念,也無法將建構函式私有化,這裡寫不成單例模式。
具體程式如下:
#-*-coding:utf-8-*- import MySQLdb #資料庫操作類 class DB: conn=None;#這裡的None相當於其它語言的NULL def __init__(self):#建構函式 self.conn=MySQLdb.connect(host="127.0.0.1",user="pc",passwd="admin",db="test",port=3306); #資料庫連線,localhost python不認,必須127.0.0.1 def getBySql(self,sql,*param): cursor=self.conn.cursor();#初始化遊標 result=cursor.fetchmany(cursor.execute(sql,param)); self.conn.commit();#提交上面的sql語句到資料庫執行 return result; def getBySql_result_unique(self,sql,*param): cursor=self.conn.cursor();#初始化遊標 result=cursor.fetchmany(cursor.execute(sql,param)); self.conn.commit();#提交上面的sql語句到資料庫執行 return result[0][0]; def setBySql(self,sql,*param): cursor=self.conn.cursor();#初始化遊標 cursor.execute(sql,param); self.conn.commit();#提交上面的sql語句到資料庫執行 def __del__(self):#解構函式 self.conn.close();#關閉資料庫連線 #主程式 db=DB(); print "usertable中的條目數:" print db.getBySql_result_unique("select count(*) from usertable"); print "usertable中id大於4的結果:" result=db.getBySql("select * from usertable where id>%s",4) for row in result: for cell in row: print str(cell)+",", print; #增刪改例項:db.setBySql("insert into usertable(username,password) values(%s,%s)","ff","s");
執行結果如下:
在主程式中先例項化DB Mysql資料庫操作類。
在這個資料庫操作類的建構函式中先建立資料庫連線,增刪改這樣無資料返回的操作,初始化遊標之後,直接利用execute(self, query, args):執行單條sql語句就行,其實這個函式的返回值就是受影響的行數,唯一需要清晰就是(或者說是我感到奇怪的是),在執行完插入或刪除或修改操作後,需要呼叫一下conn.commit()方法進行提交。這樣,資料才會真正儲存在資料庫中。我不清楚是否是我的mysql設定問題,總之,如果不用commit,那資料就不會保留在資料庫中,但是,資料確實在資料庫呆過。因為自動編號進行了累積,而且返回的受影響的行數並不為0。反正記住Python要求所有資料庫操作必須commit就是。所以打包成這樣的一個類,在主函式直接呼叫這個方法,你就不用每次submit了。
這裡利用到《【Python】建構函式、解構函式與可變引數傳遞》(點選開啟連結)接受變長引數,如同C語言的printf函式一樣,後面的引數自動替換%s,雖然一般python不會用來寫web,但是主要利用到python的變數型別自動轉化的特性,你無須關注變數型別。換句話說,要注意的是,無論你要插入的資料是什麼型別,佔位符永遠都要用%s。
對於有返回值的select語言,在cursor.execute()之後還要通過cursor.fetchmany()返回一個二維陣列。將返回的結果集,一張表,自動存放的一個可變長的list之後。得到這個list自行遍歷即可。
這裡特意開一個方法,針對只有一個結果返回的查詢。直接取其[0][0]位置,得到查詢得到的唯一結果。儘管python還有其它方法,例如fetchone等,但個人感覺並不好使。
上述程式完成基本的增刪改查CRUD,增加(Create)、讀取(Retrieve)(重新得到資料)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫,足夠!