Python导出sql语句结果到Excel
本文档是因为每周需要统计线上数据库中客户新增资源,手动执行实在是麻烦,就写了个脚本导出到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的更多相关文章
- PowerDesigner 创建表格及导出SQL语句
PowerDesigner 创建表格及导出SQL语句 目的:提高数据库创建表格效率 测试数据库:orcale 1.新建物理模型. 右键点击workplace,new一个物理模型并指定数据库. 2. ...
- 利用powerdesigner创建表模型后导出sql语句方法,以及报错 Generation aborted due to errors detected during the verification of the model.的解决办法
今天用powerdesigner建了表模型,下面先说一下导出sql语句的步骤. 1.选项 2. 然后就报错了,下面说解决办法,很简单. 你没看错,把模型检查的√去掉就行了~~ 导出表名不带双引号的设置 ...
- 使用python执行sql语句和外键解析
一.下载并导入pymysql pip install pymysql && import pymysql db=pymysql.connect(host=) #如果报错host大概率因 ...
- python快速导出sql语句(mssql)的查询结果到Excel,解决SSMS无法加载大字段的问题
遇到一个尴尬的问题,SSMS的GridView对于大字段的(varchar(max),text之类的),支持不太友好的,超过8000个长度之外的字符,SSMS的表格是显示不出来的(当然也就看不到了), ...
- 利用Excel导出sql语句
在工作中遇到了需要用数据库的insert语句,本来是极其简单的事情,但是碰到了有n个(n很大)字段的表,写insert语句就是极其痛苦的事情了,即使只是复制粘贴也是很费力不讨好的一件事.正好手头有ex ...
- mysql 导出select语句结果到excel文件等
一.导出数据外部 1)mysql连接+将查询结果输出到文件.在命令行中执行(windows的cmd命令行,mac的终端) mysql -hxx -uxx -pxx -e "query sta ...
- 如何将sqlserver表中的数据导出sql语句或生成insert into语句 [转]
输入表名,生成插入语句 drop proc proc_insert //如果存在就删除 go create proc proc_insert (@tablename varchar(256)) as ...
- 从SQL Server数据库导出SQL语句
不同于直接 备份/恢复 或者 导入/导出 数据库操作. 新版本SQL Server客户端中还可以生成相对应的SQL语句. 非常方便与查看和与其他人共享. 连接上数据库后, 右击数据库, 选择 Gene ...
- python模拟SQL语句操作文件
1.需求 在文本界面输入SQL语句,查询相应的数据,例如输入下面的语句 print(''' 支持大小写的SQL语句查询,大写或者小写都可以 1. select * from db1.emp 2. se ...
随机推荐
- CPU的段寄存器
http://www.cnblogs.com/tolimit/p/4775945.html?utm_source=tuicool&utm_medium=referral CPU的段寄存器 在C ...
- PHP 5.4 on CentOS/RHEL 7.0, 6.5 and 5.10 via Yum
PHP 5.4.36 has been released on PHP.net on 18th December 2014, and is also available for CentOS/RHEL ...
- 自己编写shave函数
import numpy def shave(I,border=None): I = I[border[0]:I.shape[0]-border[0],border[1]:I.shape[1]-bor ...
- NodeJS中常见异步接口定义(get、post、jsonp)
越来越多的人在使用nodeJS,作为一门服务端语言,我们不可避免的要写异步接口(ajax和jsonp).再次强调ajax和jsonp是两个概念,但是由于jquery的封装,使这两种异步接口的调用方式, ...
- vue 用户输入搜索 与无限下拉
vue项目中,用户输入关键字搜索,并且手机端做无限下拉 watch: { 'getListForm.searchKey'(val) { this.radioChange(); // 还有其他逻辑,内部 ...
- Centos7下MySql5.7安装及配置
安装MySql 软件包: mysql-community-libs-5.7.22-1.el7.x86_64.rpm mysql-community-common-5.7.22-1.el7.x86_64 ...
- BZOJ2752: [HAOI2012]高速公路(road)(线段树 期望)
Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1820 Solved: 736[Submit][Status][Discuss] Descripti ...
- datatable设置动态宽度,超过一定长度出现滚动条
获得宽度:var tableAutoWidth = $('.dataTable_wrapper').width();if (tableAutoWidth < 1200) { tableAutoW ...
- JAVA实现RSA加密,非对称加密算法
RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.K ...
- hdoj 1237 模拟
计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过 ...