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ù)