一、缘由
在公司报表系统没有出来之前,每日运营数据的需求由运维或者DBA查数据库手动拉取,徒增工作量。
故考虑做一个exe文件,让产品童鞋点一下就自动生成一个包含昨日的数据的Excel表格,省心省力。
二、环境
Win10 + Pycharm + Python3.7 + pymysql + openpyxl + pyinstaller
说明:
- 因为办公环境是windows,如果是Linux、Mac则可以设置定时任务来自动跑Python脚本
- openpyxl模块,用来处理excel文档,操作简单,功能强大
- pyinstaller模块,可以将python脚本打包成exe程序,还可以加密除入口函数外的pyhon脚本。
三、代码实现
import pymysql
import time
from openpyxl import Workbook
# MySQL查询函数
def query_db(sql):
conn = pymysql.connect(host='1.1.1.1',
port=3306,
user='test_ro',
password='$uT%8ono',
db='test',
cursorclass=pymysql.cursors.DictCursor
)
with conn.cursor() as cursor:
# 为了避免SQL注入,生产环境这里不要直接传入SQL,要带参数的拼接形式
cursor.execute(sql)
result = cursor.fetchall()
conn.close()
return result
# 处理多个SQL查询语句,并将结果拼接成包含多个字典的列表
def handle_result():
# 获得昨天的日期
yesterday_time = time.localtime(time.time()-86400)
yesterday = time.strftime('%Y-%m-%d', yesterday_time)
res_list = [{'日期': '{}'.format(yesterday)}, ]
sql_list = [
"SELECT COUNT(*) AS '累计进件总笔数' FROM ( SELECT COUNT(*) FROM test_apply_account WHERE apply_date < '{} 23:59:59' GROUP BY cert_no) A".format(yesterday),
"SELECT count(*) AS '当日进件总笔数' FROM (SELECT count(*) FROM test_apply_account WHERE apply_date BETWEEN '{} 00:00:00' AND '{} 23:59:59' GROUP BY cert_no) A".format(yesterday, yesterday),
"SELECT count(*) as '当日授信总笔数数' FROM test_credit_apply WHERE credit_date BETWEEN '{} 00:00:00' AND '{} 23:59:59'".format(yesterday, yesterday),
"SELECT count(*) as '当日授信通过笔数' FROM test_credit_apply WHERE credit_date BETWEEN '{} 00:00:00' AND '{} 23:59:59' AND credit_status='SUCCESS'".format(yesterday, yesterday),
]
for sql in sql_list:
res = query_db(sql)
res_list += res
return res_list
# 将拼接好的数据写入excel,以新建excel表格的形式
def write_excel(data):
wb = Workbook()
wb.create_sheet('XX每日数据', 0)
sheet = wb.active
i = 1
for item in data:
sheet.cell(row=1, column=i, value=list(item.keys())[0])
sheet.cell(row=2, column=i, value=list(item.values())[0])
i += 1
wb.save('xx_everyday.xlsx')
if __name__ == '__main__':
res_list = handle_result()
write_excel(res_list)
四、将python脚本打包成exe文件
这里使用pyinstaller模块,具体命令为:
pyinstaller -F -c --key 123456 main.py
参数解释:
- -F 打包成单个exe文件,相反的参数为-D
- -c 显示cmd控制台,相反的参数为-w
- –key 密钥,加密打包,但是只对引入的库文件进行加密,所以建议main.py中只写入口函数,其他的函数进行引用
- 这样的加密基本安全,要想完全反编译,没点水平很难做到。
注意:pyinstaller 加密需要tinyaes包,tinyaes又依赖于Microsoft Visual C++,C++也要安装Win10 SDK。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com