最近公司有用Python连接数据库跑数,并自动定时发送邮件报表的需求,所以我们最近在这一块花了一些时间实现。
自动发送邮件可参考之前的文章【干货】用Python每天定时发送监控邮件,本文和大家分享如何应用Python自动连接数据库跑数。
本文目录
- 效果展示
- 代码详解 2.1 导入库 2.2 连接数据库 2.3 执行sql 2.4 处理数据
一、效果展示
在正式进入代码讲解之前,先来看下自动定时发送邮件的实现效果。
由于部分数据涉及到公司信息,出于职业道德做了数值处理和打码,请见谅。
二、代码详解
本小节会详细阐述如何应用python实现连接数据库跑数。主要思路是:
step1:连接数据库,创建游标。
step2:确定跑数脚本,执行跑数代码。
step3:对得到的执行结果进行数据处理。
1 导入库
首先导入本文需要加载的库,如果你有些库还没有安装,导致运行代码时报错,可以在Anaconda Prompt中用pip方法安装。
代码语言:javascript复制import datetime
import pymysql
import numpy as py
import pandas as pd
其中datetime是时间处理包,pymysql是连接数据库的包,numpy和pandas是数据处理包。
2 连接数据库
导入库后,执行如下连接数据库代码。
代码语言:javascript复制db = pymysql.connect(host='10.101.2.36', #要连接的主机地址
user='selxxx', #用于登录的数据库用户
password='selxxx@123', #用户密码
database='xxx_loan', #要连接的数据库
port=3306, #连接的端口
charset='', #字符编码
use_unicode=None, #是否使用unicode编码
connect_timeout=10000 #连接超时时间
)
cursor = db.cursor() #创建一个游标
其中user、password、database对应的内容需要替换成你要连接的数据库信息。
3 执行sql
接着,执行sql语句,得到数据结果。
代码语言:javascript复制#版本一:直接在程序中写sql
sql_recent_5d_sx = '''
select
appl_date,
count(
distinct
case when u.appl_type=1
then loan_appl_no
else null
end
) as `申请量`,
count(
distinct
case
when u.appl_type=1
and OUT_TEMPDECISION = 'PASS'
then loan_appl_no
else null
end
) as `系统自动通过量`
from table
''' #sql脚本
cursor.execute(sql_recent_5d_sx) #执行sql语句
sql_result = cursor.fetchall() #取出操作返回的所有的行
#版本二:把sql存到txt文档中
sql_path_recent_5d_sx = r'C:Usersxzyrecent_5day_sx.txt' #标记sql存储路径
sql_recent_5d_sx = open(sql_path_recent_5d_sx, encoding='utf-8').read() #打开sql脚本并读取sql
cursor.execute(sql_recent_5d_sx) #执行sql语句
sql_result = cursor.fetchall() #取出操作返回的所有的行
本文介绍了两个执行sql的版本,当你的sql语句不是很长的时候,可以使用版本一,直接在程序中写sql。
当sql语句较长时,建议使用版本二,会让python代码更清晰和整洁。
其中sql_result存储的就是执行sql语句后得到的全量数据。
4 处理数据
最后,对得到的全量数据根据需求进行个性化处理。
代码语言:javascript复制data_recent_5d_yx = pd.DataFrame(sql_result) #把sql结果转成数据框
data_recent_5d_yx.columns = [
'date',
'用信申请笔数',
'用信通过笔数',
'用信通过率',
'用信金额',
'白条支付占比',
'白条提现占比',
'白条外部用款占比',
'先息后本占比',
'等额本息占比'
] #给数据框添加列名
data_recent_5d_yx = data_recent_5d_yx.T #把数据框转置一下
data_recent_5d_yx.columns = data_recent_5d_yx.iloc[0] #给数据框添加行名
data_recent_5d_yx = data_recent_5d_yx.iloc[1:] #删除第一行
#data_recent_5d_yx
for i in data_recent_5d_yx.columns:
data_list_2.remove(i)
for i in data_list_2:
data_recent_5d_yx[i] = 0
data_recent_5d_yx_f = data_recent_5d_yx[data_list_0] #最终结果
这一步的处理方式因需要而改变,大家可以自行处理。
至此,用Python实现连接数据库取数需求已分享完毕,有需要的小伙伴可以根据本文代码自行实现。