需求说明


开发不愿意单独为某个项目做后台

并且运营那边需要合并多个表的数据

因此找上了我。

要求每周执行一次。月初也执行一次

要查询2个mysql数据库多个表并生成excel表

我的想法


找开发要sql语句。同时要求说明查询结果如何填充excel表

把程序打成exe的。放在某个可以连接数据库的windows机器上。通过计划任务定期执行

同时安装一个nginx作为http文件服务器。再做个简单认证。让运营去打开下载即可

代码实现


import datetime,pymysql,time
import xlwt mysql_host='172.16.203.1'
#mysql_host='10.0.2.17'
mysql_port=13306
#mysql_port=3306
mysql_db1='tzqweb'
mysql_db2='password' #这里输入真实密码
mysql_user='system'
mysql_pass='password' #这里输入真实密码 #上一个月的第一天日期2018-09-01这种格式
if datetime.date.today().month==1:
LastMonthFirstDay = datetime.date(datetime.date.today().year-1,datetime.date.today().month+11,1)
else:
LastMonthFirstDay = datetime.date(datetime.date.today().year,datetime.date.today().month-1,1)
#上一个月的最后日期2018-09-01这种格式
LastMonthLastDay = datetime.date(datetime.date.today().year,datetime.date.today().month,1)-datetime.timedelta(1) #获取这个月第一天2018-09-01这种格式
ThisMonthFirst_day=datetime.date.today().replace(day=1)
#获取今天2018-09-01这种格式
ThisMonthToday=datetime.date.today() ##得到这个月的sql--1
print('sql----------------1,返回值为8列')
#获取的值为8列个数字,第一个是日期,第2个是新用户访问,第3个是点击人数,第4个是点击次数,5是包月人数,6是包月失败,7老包月,8点播人数
SQL1='''select tab1.time1,ifnull(s4.zcrs,0) as zcrs ,ifnull(s1.djrs,0) as djrs ,ifnull(s1.djcs,0) as djl ,ifnull(s2.byrs,0) as byrs ,ifnull(s3.sbrs,0) as dgsbrs,ifnull(tab2.lbyfwrs,0) as lbyfwrs,ifnull(s5.dbrs,0) as dbrs from
(SELECT CONCAT(DATE_FORMAT(curdate(),'%Y-%m-'),aa.stats_day) time1 FROM mydate aa WHERE CAST(aa.stats_day AS SIGNED)<=DAYOFMONTH(last_day(curdate()))) tab1
left join
(select s1.time1 as time1,count(DISTINCT o.userid) as lbyfwrs from
(SELECT CONCAT(DATE_FORMAT(curdate(),'%Y-%m-'),aa.stats_day) time1 FROM mydate aa WHERE CAST(aa.stats_day AS SIGNED)<=DAYOFMONTH(last_day(curdate()))) s1,
edu_userorder o,edu_userapp a
where o.appid=188 and o.ordertime<=CONCAT(DATE_ADD(s1.time1,interval -1 day),' 23:59:59')
and a.userid=o.userid and a.appid=188 and a.recordtime<=CONCAT(s1.time1,' 23:59:59')
and a.recordtime>=CONCAT(s1.time1,' 00:00:00')
group by s1.time1) tab2
on tab1.time1=tab2.time1
left join
(select DATE_FORMAT(t.recordtime,'%Y-%m-%d') as time1,count(*) as djcs,count(distinct t.userid) as djrs from edu_userapp t where t.recordtime>=CONCAT(DATE_ADD(curdate(),interval -day(curdate())+1 day),' 00:00:00')
and t.recordtime<=CONCAT(last_day(curdate()),' 23:59:59') and t.appid=188
group by DATE_FORMAT(t.recordtime,'%Y-%m-%d') )s1
on tab1.time1=s1.time1 left join
( select DATE_FORMAT(t.ordertime,'%Y-%m-%d') as time2, count(distinct t.userid) as byrs from edu_userorder t where t.ordertime>=CONCAT(DATE_ADD(curdate(),interval -day(curdate())+1 day),' 00:00:00')
and t.ordertime<=CONCAT(last_day(curdate()),' 23:59:59') and t.appid=188
group by DATE_FORMAT(t.ordertime,'%Y-%m-%d')) s2
on tab1.time1=s2.time2 left join
(select DATE_FORMAT(t.recordtime,'%Y-%m-%d') as time2, count(distinct t.userid) as sbrs from edu_userorder_fail t where t.recordtime>=CONCAT(DATE_ADD(curdate(),interval -day(curdate())+1 day),' 00:00:00')
and t.recordtime<=CONCAT(last_day(curdate()),' 23:59:59') and t.appid=188 and t.errorcode='9314'
group by DATE_FORMAT(t.recordtime,'%Y-%m-%d')) s3
on tab1.time1=s3.time2 left join
(select DATE_FORMAT(t.recordtime,'%Y-%m-%d') as time1,count(*) as zcrs from (
select a.userid,min(a.recordtime) as recordtime from edu_userapp a where a.appid=188 group by a.userid
) t where t.recordtime>=CONCAT(DATE_ADD(curdate(),interval -day(curdate())+1 day),' 00:00:00')
and t.recordtime<=CONCAT(last_day(curdate()),' 23:59:59')
group by DATE_FORMAT(t.recordtime,'%Y-%m-%d') )s4
on tab1.time1=s4.time1 left join
(
select DATE_FORMAT(bl.starttime,'%Y-%m-%d') as time1,count(DISTINCT bl.userid) as dbrs from seewomq.edu_userlogs bl
where bl.starttime>=CONCAT(DATE_ADD(curdate(),interval -day(curdate())+1 day),' 00:00:00')
and bl.starttime<=CONCAT(last_day(curdate()),' 23:59:59')
and bl.platform='ttmq'
group by DATE_FORMAT(bl.starttime,'%Y-%m-%d')
)s5
on tab1.time1=s5.time1
order by tab1.time1;''' #获取的值为2个数字,第一个是点击人数,第二个是点击次数
SQL2='''select count(DISTINCT a.userid) as zdjrs ,count(*) zdjl from edu_userapp a
where a.appid=188 and a.recordtime<=CONCAT(last_day(curdate()),' 23:59:59') and a.recordtime>=CONCAT(DATE_ADD(curdate(),interval -day(curdate())+1 day),' 00:00:00') ;
''' #获取的值为1个数字,值为点播人数
SQL3='''select count(DISTINCT bl.userid) as dbrs from seewomq.edu_userlogs bl
where bl.starttime>=CONCAT(DATE_ADD(curdate(),interval -day(curdate())+1 day),' 00:00:00')
and bl.starttime<=CONCAT(last_day(curdate()),' 23:59:59')
and bl.platform='ttmq';
'''
#获取的值为2列,值为各个书本点播人数
SQL4='''select v.videoName, count(DISTINCT bl.userid) as dbrs from seewomq.edu_video v left join seewomq.edu_userlogs bl
on v.id=bl.videoID and bl.starttime>=CONCAT(DATE_ADD(curdate(),interval -day(curdate())+1 day),' 00:00:00') and bl.starttime<=CONCAT(last_day(curdate()),' 23:59:59')
and bl.platform='ttmq' group by v.videoName order by count(DISTINCT bl.userid) desc;
''' #定义个方法执行查询sql操作
def get_data(db,sql):
# 使用cursor()方法获取操作游标
cur1 = db.cursor()
try:
cur1.execute(sql) #执行sql语句
return cur1.fetchall() #获取查询的所有记录
except Exception as e:
raise e
finally:
db.close() #关闭连接
print('################################################################')
print('准备获取sql1------data------------------------------------')
#打开数据库连接
db1= pymysql.connect(host=mysql_host,user=mysql_user,
password=mysql_pass,db=mysql_db1,port=mysql_port)
data_1=get_data(db1,SQL1)
#遍历结果
#获取的值为8列个数字,第一个是日期,第2个是新用户访问,第3个是点击人数,第4个是点击次数,5是包月人数,6是包月失败,7老包月,8点播人数
sql_1_data_list=[]
for row in data_1 :
tmp_list=[]
row_date = row[0]
row_new_user = row[1]
row_click_user = row[2]
row_click_count=row[3]
row_order_users=row[4]
row_order_fails=row[5]
row_order_old=row[6]
row_dianbo=row[7]
tmp_list.append(row_date)
tmp_list.append(row_new_user)
tmp_list.append(row_click_user)
tmp_list.append(row_click_count)
tmp_list.append(row_order_users)
tmp_list.append(row_order_fails)
tmp_list.append(row_order_old)
tmp_list.append(row_dianbo)
sql_1_data_list.append(tmp_list) print('sql----1------data---****************************') print('准备获取sql2------data------------------------------------')
db1= pymysql.connect(host=mysql_host,user=mysql_user,
password=mysql_pass,db=mysql_db1,port=mysql_port)
data_2=get_data(db1,SQL2)
sql_2_data_list=[]
for row in data_2:
sql_2_data_list.append(row[0])
sql_2_data_list.append(row[1]) print(sql_2_data_list)
print('sql----2------data---****************************') print('准备获取sql3------data------------------------------------')
db1= pymysql.connect(host=mysql_host,user=mysql_user,
password=mysql_pass,db=mysql_db1,port=mysql_port)
data_3=get_data(db1,SQL3)
sql_3_data_list=[]
for row in data_3:
sql_3_data_list.append(row[0])
print(sql_3_data_list) print('sql----3------data---****************************') print('准备获取sql4------data-------------------------------------------')
db1= pymysql.connect(host=mysql_host,user=mysql_user,
password=mysql_pass,db=mysql_db1,port=mysql_port)
data_4=get_data(db1,SQL4)
sql_4_data_list=[]
for row in data_4:
tmp_list=[]
tmp_list.append(row[0])
tmp_list.append(row[1])
sql_4_data_list.append(tmp_list)
#
print(sql_4_data_list)
print('sql----4------data---****************************') print('#########################准备写excel表###########################################') # 创建 xls 文件对象
wb = xlwt.Workbook()
# 新增一个表单
sh = wb.add_sheet('Last_month')
#先写标题列
sh.write(0,0,'日期')
sh.write(0,1,'新用户访问')
sh.write(0,2,'点击人数')
sh.write(0,3,'点击次数')
sh.write(0,4,'包月人数')
sh.write(0,5,'失败人数')
sh.write(0,6,'老包月访问')
sh.write(0,7,'点播人数')
sh.write(0,8,'活跃率')
sh.write(0,9,'书本')
sh.write(0,10,'点击人数')
# 按位置添加数据
#先写excel添加---sql—1-data
data_1_lenth=len(sql_1_data_list)
print(sql_1_data_list)
start_row_num=1
for data_list in sql_1_data_list:
start_col_num=0
for item in data_list:
sh.write(start_row_num,start_col_num,item)
start_col_num+=1
start_row_num+=1 #第一列写合计
sh.write(data_1_lenth+1,0,'合计') #写excel添加---sql—2-data
# sql_2_row_start=31
sql_2_row_start=data_1_lenth+1
sql_2_col_start=2
print(sql_2_data_list)
for sql_2_data in sql_2_data_list:
sh.write(sql_2_row_start,sql_2_col_start,sql_2_data)
sql_2_col_start+=1 #写excel添加---sql—3-data
sql_3_row_start=data_1_lenth+1
sql_3_col=7
sh.write(sql_3_row_start,sql_3_col,sql_3_data_list[0]) #写excel添加---sql—4-data
sql_4_row_start=1
sql_4_item_1_col=9
sql_4_item_2_col=10
for sql_4_data in sql_4_data_list:
sh.write(sql_4_row_start,sql_4_item_1_col,sql_4_data[0])
sh.write(sql_4_row_start,sql_4_item_2_col,sql_4_data[1])
sql_4_row_start+=1 filename=str(ThisMonthToday)
# 保存文件
wb.save(filename+'月报'+'.xls')

  

python查询mysql并生成excel表的更多相关文章

  1. 【工具篇】利用DBExportDoc V1.0 For MySQL自动生成数据库表结构文档

    对于DBA或开发来说,如何规范化你的数据库表结构文档是灰常之重要的一件事情.但是当你的库,你的表排山倒海滴多的时候,你就会很头疼了. 推荐一款工具DBExportDoc V1.0 For MySQL( ...

  2. [python] 查询mysql返回datetime类型数据的处理

    Python 查询Mysql,如果是datetime类型,在json序列化的时候会出现问题. 在网上查了一下,解决方案基本都是遍历dict数据,如果是datetime则转化为字符串. from dat ...

  3. MySQL 如何生成月份表

    MySQL 如何生成月份表 如果遇到按照月份统计信息的时候,常用的统计方式就是用month表去连接order表,下面就是生成月份表的过程 1.首先是建表 CREATE TABLE `sn_month` ...

  4. MySQL 如何生成日期表

    MySQL 如何生成日期表 在开发过程中,经常会遇到统计问题,通常交易信息都不是连续的,此时,统计出来的数据都是不连续的,所以提前生成一个时期表,当没有交易数据的时候填充0,就可以了,下面是生成日期表 ...

  5. Python查询Mysql时返回字典结构的代码

    Python查询Mysql时返回字典结构的代码 MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.D ...

  6. python查询mysql数据(3)

    python查询mysql数据(3) """数据查询""" import pymysql import datetime from pymy ...

  7. python xlrd 模块(获取Excel表中数据)

    python xlrd 模块(获取Excel表中数据) 一.安装xlrd模块   到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了pyt ...

  8. 向MySql数据库导入excel表数据

    最近要开发一个小的答题系统,如果题目人工录入那确实很麻烦.所以想到是不是可以从用一些现有数据格式的文件导入数据.在网上查了一下,看到有关于将excel的数据导入到mysql的方法.所以将题库数据整理成 ...

  9. 使用MySQL workbench 和Excel表之间的数据互相导出

    导出数据是很常用的功能,但今天在操作时遇到了一点问题,记录下来,方便其他人查阅. 1. 使用MySQL workbench 导出数据 在workbench里连接好数据库之后直接点击左侧的managem ...

随机推荐

  1. date clock

    设置Linux系统时间:date -s "2017-06-22 15:44:30" 自定义时间显示格式:date "+%Y-%m-%d  %H:%M:%S" 查 ...

  2. 简单的ALV示例

    在这里也推荐一条链接,很适合初学者:https://blog.csdn.net/Kang_xiong/article/details/64922576 这是一个特别基础的示例,适合没有任何ABAP基础 ...

  3. eclipse中添加jstl标签支持(引入头)

    https://blog.csdn.net/wangyuxuan_java/article/details/8580318

  4. 2018-2019-2 20175224 实验二《Java面向对象程序设计》实验报告

    一.实验报告封面 课程:Java程序设计 班级:1752班 姓名:艾星言 学号:20175224 指导教师:娄嘉鹏 实验日期:2019年4月17日 实验时间:13:45 - 15:25 实验序号:24 ...

  5. pytest自动化6:pytest.mark.parametrize装饰器--测试用例参数化

    前言:pytest.mark.parametrize装饰器可以实现测试用例参数化. parametrizing 1.  下面是一个简单是实例,检查一定的输入和期望输出测试功能的典型例子 2.  标记单 ...

  6. Debian 系linux切换登录管理器(display manager)

    在控制台中sudo dpkg-reconfigure <你的dm包名>即可dm选择列表,选择自己需要的dm 例如ubutu18默认使用gdm3,则输入命令: sudo dpkg-recon ...

  7. CenOS 更换yum源

    说明: 更换CentOS yum源既是修改配置文件/etc/yum.repos.d/CentOS-Base.repo. 目前有很多公司都提供yum源文件的下载,所以我们可以不需要去修改这个文件,直接从 ...

  8. kafka学习笔记整理01

    Apache Kafka 消息中间件->流式数据处理平台 特点: 高可靠性(分布式.分区.复制和容错).高吞吐量.持久化 消息模式:1)队列式(或点对点):在点对点消息系统中,消息被保存在队列中 ...

  9. Filter 中空指针错误

    Filter 是过滤器,凡是通过servlet  JSP 的请求需要filter 进行过滤或者拦截操作,保证数据的合法或者逻辑正确性 但是写第一个filter 配置完成后,发现jsp 文件进不去了,直 ...

  10. C++编程入门

    学习一门新的程序设计语言的最好方法就是练习编写程序. 每个C++程序都包含一个或多个函数,其中一个必须命名为main.操作系统通过调用main来运行C++程序. 一个函数定义包含四个部分:返回类型:函 ...