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大數據與數據倉庫