实现Python连接数据库取数需求

2021-12-30 16:09:53 浏览数 (1)

最近公司有用Python连接数据库跑数,并自动定时发送邮件报表的需求,所以我们最近在这一块花了一些时间实现。

自动发送邮件可参考之前的文章【干货】用Python每天定时发送监控邮件,本文和大家分享如何应用Python自动连接数据库跑数。

本文目录

  1. 效果展示
  2. 代码详解 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实现连接数据库取数需求已分享完毕,有需要的小伙伴可以根据本文代码自行实现。

0 人点赞