ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

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

2021-07-12 11:56:19  阅读:176  来源: 互联网

标签:封装 Python self Mysql productname cursor sql 一个包 连接


 

 

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

 

数据分析免不了使用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有