首先得安装各种库。。。。

诸如mysql,pandas,numpy之类的了

我使用的pandas版本为pandas (0.16.2)

其中openpyxls版本为openpyxl (1.8.6)

    其实到处mysql查询结果导出当然可以使用诸如sqllog,Navicat之类的客户端直接导出,简单快捷,下面的代码只是在需要定时并且以某种格式定期发送sql查询结果的环境下才存在的。

    注:再者pandas当然还可以结合matplotlib生成漂亮的饼状图或者柱状图,只不过笔者暂时没有这个需求,所以没有写生成图片的部分

放代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import 
pandas
import 
pandas as pd
import 
MySQLdb
import 
MySQLdb.cursors
import 
os
import 
datetime
from 
email.mime.text 
import 
MIMEText
from 
email.mime.multipart 
import 
MIMEMultipart
import 
smtplib
 
 
#返回SQL结果的函数
def 
retsql(sql):
    
db_user 
= 
MySQLdb.connect(
'IP'
,
'用户名'
,
'密码'
,
'j数据库名(可以不指定)'
,cursorclass
=
MySQLdb.cursors.DictCursor(设置返回结果以字典的格式))
    
cursor 
= 
db_user.cursor()
    
cursor.execute(
"SET NAMES utf8;"
(设置字符集为utf
-
8
,不然在返回的结果中会显示乱码,即使数据库的编码设置就是utf
-
8
)) 
    
cursor.execute(sql)
    
ret 
= 
cursor.fetchall()
    
db_user.close()
 
    
return 
ret
 
#生成xls文件的函数
def 
retxls(ret,dt):
    
file_name 
= 
datetime.datetime.now().strftime(
"/path/to/store/%Y-%m-%d-%H:%M"
+ 
dt 
+ 
".sql.xlsx"
    
dret 
= 
pd.DataFrame.from_records(ret)
    
dret.to_excel(filename,
"Sheet1"
,engine
=
"openpyxl"
###z注意openpyxl这个库可能在生成xls的时候出错,pip install openpyxls==1.8.6,其他版本似乎与pandas有点冲突,安装1.8.6的即可
 
    
print 
"Ok!!! the file in"
,file_name
    
return 
filename
 
#发送邮件的函数
##传入主题,显示名,目标邮箱,附件名
def 
sendm(sub,cttstr,to_list,
file
):
    
msg 
= 
MIMEMultipart()
    
att 
= 
MIMEText(
open
(
file
,
'rb'
).read(),
"base64"
,
"utf-8"
)
    
att[
"Content-Type"
= 
"application/octet-stream"
    
att[
"Content-Disposition"
= 
'attachment; filename="sql查询结果.xlsx"'
 
    
msg[
'from'
= 
'发件人地址'
    
msg[
'subject'
= 
sub
    
ctt 
= 
MIMEText(cttstr,
'plain'
,
'utf-8'
)
 
    
msg.attach(att)
    
msg.attach(ctt)
    
try
:
        
server 
= 
smtplib.SMTP()
        
#server.set_debuglevel(1)  ###如果问题可打开此选项以便调试
        
server.connect(
"mail.example.com"
,
'25'
)
        
server.starttls()   
###如果开启了ssl或者tls加密,开启加密
        
server.login(
"可用邮箱用户名"
,
"密码"
)
        
server.sendmail(msg[
'from'
],to_list,msg.as_string())
        
server.quit()
        
print 
'ok!!!'
    
except 
Exception,e:
        
print 
str
(e)
 
 
###想要查询的sql语句
sql
=
"""sql语句"""
 
 
 
#接收邮件的用户列表
to_list 
= 
[
'test1@example.com'
,
 
'test2@example.com'
]
 
 
 
#执行sql并将结果传递给ret
ret 
= 
retsql(sql)
 
#将结果文件路径结果传给retfile
retfile 
= 
retxls(ret,
"1"
)
 
 
#发送邮件
#发送sql语句内容
sendm(sub1,sub1,to_list,retfile1)

    虽然上述代码还有很大的改动空间,但是能用并且已经用了,又不是很重要的部分,就不继续改进了。