本文档是因为每周需要统计线上数据库中客户新增资源,手动执行实在是麻烦,就写了个脚本导出到Excel,顺便发一封邮件。

(当然这不是线上的真实脚本,不过根据个人需求稍微修改下,还是可以直接用的。拿去不谢!!)

将想发出邮件的SQL语句写到exec.sql:

 vim /tmp/exec.sql
select * from db;

编辑Python脚本:

root@localhost:/tmp# vim exportsql.py
#!/usr/bin/python
# coding: utf-
import sys
import xlwt
import pymysql
import datetime
import subprocess
import time
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import os.path host = 'localhost'
user = 'root'
pwd = 'jeqThs1qOVbHGRz0'
port =
db = 'mysql'
sql_file = 'exec.sql'
sheet_name = 'vm' + time.strftime("%Y-%m-%d")
filename = 'vm_' + time.strftime("%Y-%m-%d") + '.xls'
out_path = '/tmp/vm_' + time.strftime("%Y-%m-%d") + '.xls' def export():
conn = pymysql.connect(host, user, pwd, db, charset='utf8')
cursor = conn.cursor()
with open(u'%s' % sql_file, 'r+') as f:
sql_list = f.read().split(';')[:-] # sql文件最后一行加上;
sql_list = [x.replace('\n', ' ') if '\n' in x else x for x in sql_list] # 将每段sql里的换行符改成空格
##执行sql语句,使用循环执行sql语句
for sql in sql_list:
#print(sql)
count = cursor.execute(sql)
# print("查询出" + str(count) + "条记录")
if count > :
# 来重置游标的位置
cursor.scroll(, mode='absolute')
# 搜取所有结果
results = cursor.fetchall()
# 获取MYSQL里面的数据字段名称
fields = cursor.description
workbook = xlwt.Workbook(encoding='utf-8') # workbook是sheet赖以生存的载体。
sheet = workbook.add_sheet(sheet_name, cell_overwrite_ok=True)
# 写上字段信息
for field in range(, len(fields)):
sheet.write(, field, fields[field][])
# 获取并写入数据段信息
row =
col =
for row in range(, len(results) + ):
for col in range(, len(fields)):
sheet.write(row, col, u'%s' % results[row - ][col])
workbook.save(out_path)
else:
pass _user = "system@capitalcloud.com.cn"
_pwd = "*********"
areceiver = "1379354355@qq.com"
#抄送人,可写可不写,多个用,隔开
acc = "*****@capitalonline.net"
msg = MIMEMultipart()
msg["Subject"] = u'data_' + time.strftime("%Y-%m-%d")
msg["From"] = _user
msg["To"] = areceiver
msg["Cc"] = acc def send_email():
content = '''Hello, everyone,This is a test email! Have a nice day!'''
part = MIMEText(content, 'plain', 'utf-8')
msg.attach(part)
if filename:
file_name = '/tmp/' + filename
part = MIMEText(open(file_name, 'rb').read(), 'base64', 'gb2312')
part["Content-Type"] = 'application/octet-stream'
basename = os.path.basename(file_name)
part["Content-Disposition"] = 'attachment; filename=%s' % basename.encode('gb2312')
msg.attach(part)
s = smtplib.SMTP("smtp.exmail.qq.com", timeout=)
s.login(_user, _pwd)
s.sendmail(_user, areceiver.split(',') + acc.split(','), msg.as_string())
s.close()
else:
pass
if __name__ == "__main__":
export()
send_email()

测试:

python /tmp/exportsql.py

查看收件箱: (也可以去垃圾箱看看)

如果觉得手动执行比较麻烦,也可以写个计划任务,定期导出:

crontab -e
*/ * * * * /usr/bin/python /tmp/exportsql.py

Python导出sql语句结果到Excel的更多相关文章

  1. PowerDesigner 创建表格及导出SQL语句

    PowerDesigner 创建表格及导出SQL语句   目的:提高数据库创建表格效率 测试数据库:orcale 1.新建物理模型. 右键点击workplace,new一个物理模型并指定数据库. 2. ...

  2. 利用powerdesigner创建表模型后导出sql语句方法,以及报错 Generation aborted due to errors detected during the verification of the model.的解决办法

    今天用powerdesigner建了表模型,下面先说一下导出sql语句的步骤. 1.选项 2. 然后就报错了,下面说解决办法,很简单. 你没看错,把模型检查的√去掉就行了~~ 导出表名不带双引号的设置 ...

  3. 使用python执行sql语句和外键解析

    一.下载并导入pymysql pip install pymysql && import pymysql db=pymysql.connect(host=) #如果报错host大概率因 ...

  4. python快速导出sql语句(mssql)的查询结果到Excel,解决SSMS无法加载大字段的问题

    遇到一个尴尬的问题,SSMS的GridView对于大字段的(varchar(max),text之类的),支持不太友好的,超过8000个长度之外的字符,SSMS的表格是显示不出来的(当然也就看不到了), ...

  5. 利用Excel导出sql语句

    在工作中遇到了需要用数据库的insert语句,本来是极其简单的事情,但是碰到了有n个(n很大)字段的表,写insert语句就是极其痛苦的事情了,即使只是复制粘贴也是很费力不讨好的一件事.正好手头有ex ...

  6. mysql 导出select语句结果到excel文件等

    一.导出数据外部 1)mysql连接+将查询结果输出到文件.在命令行中执行(windows的cmd命令行,mac的终端) mysql -hxx -uxx -pxx -e "query sta ...

  7. 如何将sqlserver表中的数据导出sql语句或生成insert into语句 [转]

    输入表名,生成插入语句 drop proc proc_insert //如果存在就删除 go create proc proc_insert (@tablename varchar(256)) as ...

  8. 从SQL Server数据库导出SQL语句

    不同于直接 备份/恢复 或者 导入/导出 数据库操作. 新版本SQL Server客户端中还可以生成相对应的SQL语句. 非常方便与查看和与其他人共享. 连接上数据库后, 右击数据库, 选择 Gene ...

  9. python模拟SQL语句操作文件

    1.需求 在文本界面输入SQL语句,查询相应的数据,例如输入下面的语句 print(''' 支持大小写的SQL语句查询,大写或者小写都可以 1. select * from db1.emp 2. se ...

随机推荐

  1. BestCoder Round #89 1002 Fxx and game

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5945 分析: 很容易想到用bfs,然而会超时,几乎是O(xt)了 这里用单调队列优化, 首先反着来,f ...

  2. test image

    Most of these images are in PBM or PGM format and compressed with GNU Zip and GNU TAR Note: These pa ...

  3. iphone应用程序生命周期浅析

    做iphone开发有必要知道iphone程序的生命周期,说白点就是当点击程序图标启动程序开始到退出程序整个使用运行过程中底下的代码都发生了什么,只有理解生命周期,有利于我们开发人员开发出更棒的应用 接 ...

  4. hdu_3501_Calculation 2

    Given a positive integer N, your task is to calculate the sum of the positive integers less than N w ...

  5. dataTables设置下拉滚动出现表头挤在一起的解决方法

    1.引入datatable的CSS文件 <link href="http://cdn.datatables.net/1.10.15/css/jquery.dataTables.min. ...

  6. 你们知道SEO每天都在做什么吗?

    医院也有做SEO的,专门负责医院网站优化工作,那么医院的SEO每天都做什么呢?偶然见到一篇文章,转载来分享给大家.感觉写的很实在. 大凡做seo工作的人都知道seo工作者每天都要做大量的外链,像有些个 ...

  7. centos7 多网卡修改默认路由

    最近在virtualbox里搭了一个centos7的虚拟机,但是网络这一块总是有问题. 单网卡下的问题: 1.当我配置连接方式为NAT网络地址转换的时候,虚拟机可以访问外网.但是在网络地址转换的情况下 ...

  8. 中通快递股份有限公司.net高级面试题

    中通快递分布式技术开发   gc垃圾回收原理 .net中,托管代码的内存管理是自动的,由GC进行管理,而对于非托管代码,则需要.net手动处理 CLR运行时,内存分为:托管堆和栈,其中栈用于存储值类型 ...

  9. PHP CI框架学习

    CI框架的URL辅助函数使用 URL 辅助函数文件包含一些在处理 URL 中很有用的函数 加载辅助函数 在使用CI框架的使用经常碰到跳转和路径方面的问题,site_url()和base_url()很容 ...

  10. html页面 加载完成后再刷新 一次

    主要用于第一次加载页面有部分加载bug,再刷新一次即可正常运行. 简单粗暴直接上代码,不带参数,0影响 <Script>function refresh(){ url = location ...