Python操作Mysql麻煩,敢不敢自己封裝一個包可好?
數據分析免不了使用Python操作Mysql,直接操作Mysql的表,對其進行操作;或者直接將Python中的數據集統(tǒng)計的結果保存到Mysql。這個時候,一個sql客戶端連接是免不了的,每次都要寫一大堆代碼,確實很麻煩。
待你代碼寫成,女神頭發(fā)都白了!
那么,何不對這個功能,通常是自己業(yè)務常用的功能做個二次封裝呢?這樣使用起來會事半功倍,很方便。
顯然,常用業(yè)務統(tǒng)計,肯定會有很多,每次我們都重復地初始化mysql連接,然后獲取cursor(游標),執(zhí)行(查詢,插入,刪除),關閉數據庫操作,無疑是浪費時間的,我們希望將自己從煩勞的重復代碼中解放出來,代碼需要簡化。代碼簡化主要從兩個方面:
1)、功能封裝;
2)、再業(yè)務封裝;
初級階段的業(yè)務封裝對后期使用是不友好的,這里只對功能進行封裝,防止后面會有其它功能業(yè)務;
1、考慮到,獲取連接可以是個單例,數據庫可以有測試與線上,query、execute,關閉操作,是可以封裝的。
2、代碼封裝成為一個方法到一個腳本中本次使用方便,其它腳本還得重新寫,這是不行的,怎么辦,自己寫模塊,封裝成包,放在本地,供自己和其它同事使用。
這里主要封裝了常用的時間模塊,比如獲取前2個小時,前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的獲取連接,查詢、插入、關閉連接功能。默認參數是測試數據庫連接信息,使用其它數據庫只需要傳入對應數據庫連接參數即可。
這樣下次使用的時候,只需要導入對應類即可
結果很甜
sys.path.append('/home/hadoop/scripts/python_module'),導入環(huán)境,
導入對應包即可。
# -*- 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操作模塊,獲取連接,查詢、插入、關閉連接只需要用拿到的對象的方法,傳入參數即可。
mclient = mysql.MysqlClient(dbName)
這就拿到了一個hive連接,不傳參數,拿到的是測試庫連接。
這樣只需要定義sql,調用對應方法即可。比如,我們定義一個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)
然后調用query()方法拿到結果即可。
result = mclient.query(sql)
一系列統(tǒng)計功能寫下來,我們會發(fā)現,滿屏的sql,功能代碼很少,這就是我們要的效果。
這樣無疑是我們只用關注實際業(yè)務,而不用重復寫通用重復代碼了,而且還可以根據實際功能,擴展功能。
Python包的目錄如下:
簡單介紹一下:可以看到,E\code\keguang\sql就是包名,使用時導入對應的.py文件即可。
作者:柯廣的網絡日志 ? Python操作Mysql麻煩,敢不敢自己封裝一個包可好?
微信公眾號:Java大數據與數據倉庫