在日常的工作中,经常接到开发同事查询生产SQL的请求,公司又不允许对开发开放查询SQL的权限,并且查询的堡垒机又很慢,计划做一个可以自动查询SQL的小工具,一周内完成吧。

  大概功能实现了,一些涉及敏感的信息已去掉。

#encoding:utf-8
import cx_Oracle
import csv
import xlwt
import xlrd
import zipfile
import time
import xlsxwriter
from datetime import datetime
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
import sys
import os reload(sys)
sys.setdefaultencoding('gbk')
username = ''
password = ''
epcis = ''
epods = ''
cxcc = ''
nba4ot = ''
claim = ''
sqlfile ='select.sql'
#date_now=datetime.now().strftime("%Y%m%d%H%M")
#zipfilename ='查询结果_'.decode('utf-8').encode('gbk')+"_"+str(date_now)+".zip" #打开查询SQL文件
def sqlstr(sqlfile):
reSql=open(sqlfile,'r').read().strip()
'''for i in open(sqlfile,'r').readlines():
if i.startswith('#') == True: #忽略掉#号开头的行
pass
else:
selectsql = selectsql + i
reSql = selectsql.split(';')'''
print reSql
return reSql def selectdb(db,selectsql):
selectsql=sqlstr(sqlfile)
print selectsql
conn = cx_Oracle.connect(username,password,db)
cur = conn.cursor()
sql = cur.execute(selectsql)
listnew=[]
title = [i[0] for i in cur.description]
listnew.append(title)
sqllist = []
sqllist = sql.fetchall()
listnew.append(sqllist)
cur.close()
conn.close
return listnew #生成excel文件
def createxlsx(sqldate):
date_now=datetime.now().strftime("%Y%m%d%H%M")
xlsxfilename = '查询结果_'.decode('utf-8').encode('gbk')+str(date_now)+'.xlsx'
workbook = xlsxwriter.Workbook(xlsxfilename,{'constant_memory':True})
worksheet = workbook.add_worksheet()
worksheet.write_row(0,0,sqldate[0])
for row,row_date in enumerate(sqldate[1]):
worksheet.write_row(row+1,0,row_date)
workbook.close()
return xlsxfilename def zipFile(xlsxfilename):
date_now=datetime.now().strftime("%Y%m%d%H%M")
zipfilename ='查询结果_'.decode('utf-8').encode('gbk')+"_"+str(date_now)+".zip"
f = zipfile.ZipFile(zipfilename,'w',zipfile.ZIP_DEFLATED)
zippath = "D:\Python27"
zipfilelist = []
for i in os.listdir(zippath):
if os.path.isfile(i):
zipfilelist.append(i)
for files in zipfilelist:
if xlsxfilename in files:
f.write(files)
os.remove(files)
f.close()
return zipfilename def sendmail(zipfilename):
msg = MIMEMultipart()
att1_name=zipfilename
att1 = MIMEText(open(zipfilename,'rb').read(),'base64','gb2312')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"]='attachment;filename=%s'% att1_name.encode('gbk')
msg.attach(att1) msg['to']='dingxiyu024@pingan.com.cn'
msg['from']='dingxiyu024@pingan.com.cn'
msg['subject']="SQL查询结果".decode('utf-8').encode('gbk')
try:
server=smtplib.SMTP()
server.connect('mailgw2.paic.com.cn')
server.login('','')
server.sendmail(msg['from'],msg['to'],msg.as_string())
server.quit()
print 'send mail successful.'
except Exception,e:
print str(e) def main():
sendmail(zipFile(createxlsx(selectdb(epcis,sqlfile)))) if main()=='__main__':
main()

20170506计划-----(基于python查询oracle语句)的更多相关文章

  1. 基于python实现Oracle数据库连接查询操作

    使用python语言连接Oracle数据库配置 #coding:utf-8 import cx_Oracle as oracle db=oracle.connect('root/123456@192. ...

  2. [Python]查询oracle导出结果至Excel并发送邮件

    环境:Linux +python2.7+oracle11g 1.提前安装xlwt(excel写入操作模块),cx_Oracle(oracle操作模块) cx_Oracle的安装步骤详见链接:https ...

  3. oracle -- 查询执行计划,判读查询语句优劣

    以oracle的scott账户:找到员工表中薪水大于本部门平均薪水的员工为例 多表查询方式: select e.empno, e.ename, e.sal, d.avgsal from emp e, ...

  4. [转载]T-SQL(Oracle)语句查询执行顺序

    原文链接:http://blog.sina.com.cn/s/blog_61c006ea0100mlgq.html sql语法的分析是从右到左,where子句中的条件书写顺序,基本上对sql性能没有影 ...

  5. python操作oracle数据库-查询

    python操作oracle数据库-查询 参照文档 http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python- ...

  6. 查询Oracle正在执行的sql语句

    --查询Oracle正在执行的sql语句及执行该语句的用户 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, ...

  7. 【转】如何解决plsql查询oracle数据库语句where条件带有中文无法匹配结果

    一.问题描述 之前使用PLSQL查询oracle数据库可以正常查询统计结果,由于换了个电脑,重新安装之后,同样的sql查询语句同一个数据库,无法正常查询结果,如下图所示 二.解决办法 1. 查询数据当 ...

  8. Python连接Oracle数据查询导出结果

    python连接oracle,需用用到模块cx_oracle,可以直接pip安装,如网络不好,可下载离线后本地安装 cx_oracle项目地址:https://pypi.org/project/cx_ ...

  9. Oracle 查询(SELECT)语句(一)

    Ø  简介 本文介绍 Oracle 中查询(SELECT)语句的使用,在 SQL 中 SELECT 语句是相对内容较多的,也是相对比较复杂一点的,所以这里拿出来单独学习. 首先,我们先来理一下思路,我 ...

随机推荐

  1. 用JavaScript制作页面特效

    1.Window对象 名称 history:有关客户访问过的URL的信息 location:有关当前URL的信息 screen:有关客户端的屏幕和显示性能的信息 常用方法 prompt():弹出输入框 ...

  2. 好用的6个css方法

    1. 黑白图像 img { filter: grayscale(100%); } 2. 使用 :not() 除它之外的其他元素 .nav li:not(:last-child) { border-ri ...

  3. 003.[python学习] 简单抓取豆瓣网电影信息程序

    声明:本程序仅用于学习爬网页数据,不可用于其它用途. 本程序仍有很多不足之处,请读者不吝赐教. 依赖:本程序依赖BeautifulSoup4和lxml,如需正确运行,请先安装.下面是代码: #!/us ...

  4. python-day19 Django模板,路由分发,ORM

    @获取文件所有数据 request.FILES: request.POST.get('fafafa')#拿到文件名: user = request.POST.get('user',None)#用get ...

  5. php laravel加密 form表单认证 laravel分页

    use Illuminate\Support\Facades\Crypt; echo Crypt::encrypt(123); //加密echo "<br>";//解密 ...

  6. python 之修饰器

    from functools import update_wrapper def debug(func): def wrapper(): print "[DEBUG]: enter {}() ...

  7. Django12-ModelForm中创建局部钩子和全局钩子

    一.局部钩子 命名规则为clean_对象名称,例如上面定义了username.pwd对象,那么可以定义clean_username.clean_pwd的局部钩子进行规则校验 1.例子:定义一个手机号校 ...

  8. Golang源码探索(二) 协程的实现原理(转)

    Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱,虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底 ...

  9. vue中v-cloak解决刷新或者加载出现闪烁(显示变量)

    在使用vue绑定数据的时候,渲染页面时会出现变量闪烁,例如 <div class="#app"> <p>{{value.name}}</p> & ...

  10. VS2017编译SNMP++步骤记录

    1.下载地址:https://www.agentpp.com/download.html 三个都下 2.新建解决方案 TestSnmp 3.下载后解压到解决方案文件夹(注意,解压后的 snmp++的版 ...