Python连库自动取数:定时把报表跑好放桌上
之前刚入行的时候运营每周需要消费明细表,我之前的操作是:开Navicat、跑SQL、导Excel、发邮件,费时费力,今天给大家分享一下怎么让Python 替你干活。
第一步:连上数据库
别被"连接数据库"吓到,就几行简单代码而已。用sqlalchemy 建个引擎,MySQL、PostgreSQL 都能用:
from sqlalchemy import create_engine
engine = create_engine('mysql+pymysql://user:pwd@host:3306/dbname?charset=utf8mb4')
特别强调一下千万别图省事把密码写死在脚本里,不然你同事拷走脚本的时候就把连库信息全泄露了。密码建议放配置文件或环境变量里。
第二步:一条 SQL 取数
连上之后,取数更简单。pandas一句话就把查询结果拉成 DataFrame:
import pandas as pd
df = pd.read_sql("SELECT 门店, SUM(金额) FROM orders GROUP BY 门店", engine)
df.to_excel('/tmp/门店业绩.xlsx', index=False)
这里有个坑:SQL里如果有中文列别名,Excel打开后会是乱码,可以加 charset=utf8mb4 解决。
第三步:定时,让它自己跑
取数脚本写好了,关键是"自动化"。可以用schedule 库让它在每天早上8点时自己跑:
import schedule
schedule.every().day.at("08:00").do(run_report)
如果想更稳,直接丢服务器上用 crontab:0 8 * * * python /path/report.py。这样你还没到公司的时候,报表已经躺在盘里了。
四个避坑,省你两小时
几个容易踩的坑:
1. 连接超时:生产库网络不稳,加pool_pre_ping=True,断线自动重连。
2. 大结果集:一次查几十万行时会爆内存,用 chunksize 分块读。
3. 时区:数据库是UTC,运营需要的是北京时间,查询前可以先 SET time_zone='+8:00'。
4. 空结果:SQL没报错但返回 0 行,脚本不判定直接发空表,可以得加个行数判断后再发。
连库取数这事,值钱的不在代码多炫,而在于"稳"。