本文档是因为每周需要统计线上数据库中客户新增资源,手动执行实在是麻烦,就写了个脚本导出到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. 将Apache2.4手动安装成Windows的服务

    将Apache2.4手动安装成Windows的服务 可以选择在安装Apache时自动将其安装为一个服务.如果选择"for all users",那么Apache将会被安装为服务. ...

  2. POJ-2151 Check the difficulty of problems---概率DP好题

    题目链接: https://vjudge.net/problem/POJ-2151 题目大意: ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率 问 每队至少解出一题且冠军队至少解出N ...

  3. VERITA Netbackup日常巡检详细说明

    VERITA备份日常监控 一. 相关检查方法.命令 1.1 启动NBU的图形管理界面: /usr/openv/netbackup/bin/jnbSA & 1.2字符界面命令: 1.2.1cat ...

  4. Object类的常用方法

    Object类是Java中所有类的始祖.如果没有明确的指定继承,则默认继承Object类.在Java中除了基本类型外都是Object类型的对象,包括数组. 1)equals方法 Object: pub ...

  5. data-ng-repeat 指令

    data-ng-repeat指令对于集合中的每一项会克隆一次HTML元素.

  6. 2.Netty的粘包、拆包(一)

    Netty粘包.拆包 1.什么是拆包.粘包 (1)拆包.粘包介绍 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连成一片的,其间并没有分界线.TC ...

  7. Filter,一种aop编程思想的体现

    一.filter简介 filter是Servlet规范里的一个高级特性,只用于对request.response的进行修改. filter提出了FilterChain的概念,客户端请求request在 ...

  8. git 简单使用(待完善)

    git是一个分布式版本控制器,简单来说就是可以记录每次代码的修改和提交,方便我们查看修改记录和版本的回退 工作流程 基本概念 仓库 git 是一个分布式版本控制器,其单位就是仓库,每个仓库就是当前gi ...

  9. BZOJ1854: [Scoi2010]游戏(二分图匹配)

    题目描述 lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性.并且每种装备 ...

  10. poj_1995_Raising Modulo Numbers

    Description People are different. Some secretly read magazines full of interesting girls' pictures, ...