1. 程式人生 > >【Python】Mysql資料庫操作類

【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)幾個單詞的首字母簡寫,足夠!