Python操作Mysql麻煩,敢不敢自己封裝一個(gè)包可好?
數(shù)據(jù)分析免不了使用Python操作Mysql,直接操作Mysql的表,對(duì)其進(jìn)行操作;或者直接將Python中的數(shù)據(jù)集統(tǒng)計(jì)的結(jié)果保存到Mysql。這個(gè)時(shí)候,一個(gè)sql客戶端連接是免不了的,每次都要寫(xiě)一大堆代碼,確實(shí)很麻煩。
待你代碼寫(xiě)成,女神頭發(fā)都白了!
那么,何不對(duì)這個(gè)功能,通常是自己業(yè)務(wù)常用的功能做個(gè)二次封裝呢?這樣使用起來(lái)會(huì)事半功倍,很方便。
顯然,常用業(yè)務(wù)統(tǒng)計(jì),肯定會(huì)有很多,每次我們都重復(fù)地初始化mysql連接,然后獲取cursor(游標(biāo)),執(zhí)行(查詢,插入,刪除),關(guān)閉數(shù)據(jù)庫(kù)操作,無(wú)疑是浪費(fèi)時(shí)間的,我們希望將自己從煩勞的重復(fù)代碼中解放出來(lái),代碼需要簡(jiǎn)化。代碼簡(jiǎn)化主要從兩個(gè)方面:
1)、功能封裝;
2)、再業(yè)務(wù)封裝;
初級(jí)階段的業(yè)務(wù)封裝對(duì)后期使用是不友好的,這里只對(duì)功能進(jìn)行封裝,防止后面會(huì)有其它功能業(yè)務(wù);
1、考慮到,獲取連接可以是個(gè)單例,數(shù)據(jù)庫(kù)可以有測(cè)試與線上,query、execute,關(guān)閉操作,是可以封裝的。
2、代碼封裝成為一個(gè)方法到一個(gè)腳本中本次使用方便,其它腳本還得重新寫(xiě),這是不行的,怎么辦,自己寫(xiě)模塊,封裝成包,放在本地,供自己和其它同事使用。
這里主要封裝了常用的時(shí)間模塊,比如獲取前2個(gè)小時(shí),前5天的日期列表等等,然后就是sql模塊,著重是sql模塊,放在sql目錄下:
# -*- coding:utf-8 -*- import MySQLdb class MysqlClient: def __init__(self, db, host = "0.0.0.0", user = "root", passwd = "root", charset='utf8'): 7 self.conn = MySQLdb.connect (host = host, user = user, passwd = passwd, db= db, charset=charset) def insert(self, sql): cursor = self.conn.cursor() cursor.execute(sql) cursor.close() self.conn.commit() def query(self, sql): cursor = self.conn.cursor() cursor.execute(sql) result = cursor.fetchall() cursor.close() return result def close(self): self.conn.close ()
這里定義了mysql的獲取連接,查詢、插入、關(guān)閉連接功能。默認(rèn)參數(shù)是測(cè)試數(shù)據(jù)庫(kù)連接信息,使用其它數(shù)據(jù)庫(kù)只需要傳入對(duì)應(yīng)數(shù)據(jù)庫(kù)連接參數(shù)即可。
這樣下次使用的時(shí)候,只需要導(dǎo)入對(duì)應(yīng)類即可
結(jié)果很甜
sys.path.append('/home/hadoop/scripts/python_module'),導(dǎo)入環(huán)境,
導(dǎo)入對(duì)應(yīng)包即可。
# -*- coding: utf-8 -*- import sys sys.path.append('/home/hadoop/scripts/python_module') import keguang.timedef as timedef import keguang.sql.mysqlclient as mysql
這樣就拿到了,hive,mysql操作模塊,獲取連接,查詢、插入、關(guān)閉連接只需要用拿到的對(duì)象的方法,傳入?yún)?shù)即可。
mclient = mysql.MysqlClient(dbName)
這就拿到了一個(gè)hive連接,不傳參數(shù),拿到的是測(cè)試庫(kù)連接。
這樣只需要定義sql,調(diào)用對(duì)應(yīng)方法即可。比如,我們定義一個(gè)sql
sql = ''' select t3.productname, t3.ct, t2.cou from (select t.productname,count(t.guid) ct from \ (select (case when productname = '' or productname is null then 'null' else productname end) \ as productname, guid from hm2.author where dt = '%s' group by productname, guid)t group by t.productname) t3\ inner join \ (select (case when productname = '' or productname is null then 'null' else productname end)\ as productname,count(guid) cou from hm2.author where dt = '%s' group by productname)t2 \ on t2.productname = t3.productname '''%(date, date)
然后調(diào)用query()方法拿到結(jié)果即可。
result = mclient.query(sql)
一系列統(tǒng)計(jì)功能寫(xiě)下來(lái),我們會(huì)發(fā)現(xiàn),滿屏的sql,功能代碼很少,這就是我們要的效果。
這樣無(wú)疑是我們只用關(guān)注實(shí)際業(yè)務(wù),而不用重復(fù)寫(xiě)通用重復(fù)代碼了,而且還可以根據(jù)實(shí)際功能,擴(kuò)展功能。
Python包的目錄如下:
簡(jiǎn)單介紹一下:可以看到,E\code\keguang\sql就是包名,使用時(shí)導(dǎo)入對(duì)應(yīng)的.py文件即可。
作者:柯廣的網(wǎng)絡(luò)日志 ? Python操作Mysql麻煩,敢不敢自己封裝一個(gè)包可好?
微信公眾號(hào):Java大數(shù)據(jù)與數(shù)據(jù)倉(cāng)庫(kù)