Python操作Mysql麻烦,敢不敢自己封装一个包可好?

数据分析免不了使用Python操作Mysql,直接操作Mysql的表,对其进行操作;或者直接将Python中的数据集统计的结果保存到Mysql。这个时候,一个sql客户端连接是免不了的,每次都要写一大堆代码,确实很麻烦。

待你代码写成,女神头发都白了!

那么,何不对这个功能,通常是自己业务常用的功能做个二次封装呢?这样使用起来会事半功倍,很方便。

显然,常用业务统计,肯定会有很多,每次我们都重复地初始化mysql连接,然后获取cursor(游标),执行(查询,插入,删除),关闭数据库操作,无疑是浪费时间的,我们希望将自己从烦劳的重复代码中解放出来,代码需要简化。代码简化主要从两个方面:

1)、功能封装;

2)、再业务封装;

初级阶段的业务封装对后期使用是不友好的,这里只对功能进行封装,防止后面会有其它功能业务;

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'),导入环境,

导入对应包即可。

# -*- 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)

 

一系列统计功能写下来,我们会发现,满屏的sql,功能代码很少,这就是我们要的效果。

这样无疑是我们只用关注实际业务,而不用重复写通用重复代码了,而且还可以根据实际功能,扩展功能。

Python包的目录如下:

简单介绍一下:可以看到,E\code\keguang\sql就是包名,使用时导入对应的.py文件即可。

 作者:柯广的网络日志 » Python操作Mysql麻烦,敢不敢自己封装一个包可好?


微信公众号:Java大数据与数据仓库