数据库
首页 > 数据库> > Python操作Mysql麻烦,敢不敢自己封装一个包可好?

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

作者:互联网

 

 

待我代码写成,便娶你为妻!

 

数据分析免不了使用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包的目录如下:

640?wx_fmt=png

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

标签:封装,Python,self,Mysql,productname,cursor,sql,一个包,连接
来源: https://blog.51cto.com/u_11548924/3044716