待我代码写成,便娶你为妻!
数据分析免不了使用Python操作Mysql,直接操作Mysql的表,对其进行操作;或者直接将Python中的数据集统计的结果保存到Mysql。这个时候,一个sql客户端连接是免不了的,每次都要写一大堆代码,确实很麻烦。
待你代码写成,女神头发都白了!
那么,何不对这个功能,通常是自己业务常用的功能做个二次封装呢?这样使用起来会事半功倍,很方便。
显然,常用业务统计,肯定会有很多,每次我们都重复地初始化mysql连接,然后获取cursor(游标),执行(查询,插入,删除),关闭数据库操作,无疑是浪费时间的,我们希望将自己从烦劳的重复代码中解放出来,代码需要简化。代码简化主要从两个方面:
1)、功能封装;
2)、再业务封装;
初级阶段的业务封装对后期使用是不友好的,这里只对功能进行封装,防止后面会有其它功能业务;
1、考虑到,获取连接可以是个单例,数据库可以有测试与线上,query、execute,关闭操作,是可以封装的。
2、代码封装成为一个方法到一个脚本中本次使用方便,其它脚本还得重新写,这是不行的,怎么办,自己写模块,封装成包,放在本地,供自己和其它同事使用。
这里主要封装了常用的时间模块,比如获取前2个小时,前5天的日期列表等等,然后就是sql模块,着重是sql模块,放在sql目录下:
1# -*- coding:utf-8 -*-
2
3import MySQLdb
4
5class MysqlClient:
6 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)
8
9 def insert(self, sql):
10 cursor = self.conn.cursor()
11 cursor.execute(sql)
12 cursor.close()
13 self.conn.commit()
14
15 def query(self, sql):
16 cursor = self.conn.cursor()
17 cursor.execute(sql)
18 result = cursor.fetchall()
19 cursor.close()
20 return result
21
22 def close(self):
23 self.conn.close ()
这里定义了mysql的获取连接,查询、插入、关闭连接功能。默认参数是测试数据库连接信息,使用其它数据库只需要传入对应数据库连接参数即可。
这样下次使用的时候,只需要导入对应类即可
结果很甜
sys.path.append('/home/hadoop/scripts/python_module'),导入环境,
导入对应包即可。
1# -*- coding: utf-8 -*-
2
3import sys
4sys.path.append('/home/hadoop/scripts/python_module')
5import keguang.timedef as timedef
6 import keguang.sql.mysqlclient as mysql
这样就拿到了,hive,mysql操作模块,获取连接,查询、插入、关闭连接只需要用拿到的对象的方法,传入参数即可。
mclient = mysql.MysqlClient(dbName)
这就拿到了一个hive连接,不传参数,拿到的是测试库连接。
这样只需要定义sql,调用对应方法即可。比如,我们定义一个sql
1sql = '''
2 select t3.productname, t3.ct, t2.cou from (select t.productname,count(t.guid) ct from \
3 (select (case when productname = '' or productname is null then 'null' else productname end) \
4 as productname, guid from hm2.author where dt = '%s' group by productname, guid)t group by t.productname) t3\
5 inner join \
6 (select (case when productname = '' or productname is null then 'null' else productname end)\
7 as productname,count(guid) cou from hm2.author where dt = '%s' group by productname)t2 \
8 on t2.productname = t3.productname
9 '''%(date, date)
10
然后调用query()方法拿到结果即可。
1result = mclient.query(sql)
一系列统计功能写下来,我们会发现,满屏的sql,功能代码很少,这就是我们要的效果。
这样无疑是我们只用关注实际业务,而不用重复写通用重复代码了,而且还可以根据实际功能,扩展功能。
Python包的目录如下:
简单介绍一下:可以看到,E\code\keguang\sql就是包名,使用时导入对应的.py文件即可。