序言背景思路代码及解析跋文
序言小工具1.0版本,备份oracle存储过程的小工具上篇文章已经都了解完毕了,下面继续进行功能升级,2.0版本-表数据的导出功能。
背景案例分析第四课-表数据导出工具
表数据导出功能其实借助工具(譬如PLSQL Developer)都是可以实现的,但是为了学习知识以及丰富我们的工具的功能。今天一起来学习一下,并且和上篇中存储过程备份脚本结合到一起。
1.首先回顾一下昨天的界面:
2.大概设计一下表数据导出的界面。
(1)填写表名的输入框
(2)加上where条件是不是更完善
(3)再就是如果比较复杂的数据可能就需要写sql,所以也需要输入sql的输入框,
(4)我们可以把表名和sql的输入框进行合并,用一个选择框来决定是表名还是sql。
(5)最后得有一个【导出数据】的按钮
综上所述,并结合昨天的界面,大概得到界面如下图所示:
根据上述的界面,用tkinter开始编写代码(建议先看看关于tkinter模块的具体用法):
1.结合昨天的代码,先得写出这个界面,代码如下:
import tkinter
from tkinter import *
menuwin = tkinter.Tk()
menuwin.title('QfTool')
screenwidth = menuwin.winfo_screenwidth()
screenheight = menuwin.winfo_screenheight()
width = 315
height = 500
menuwin.maxsize(width, height) # 设置窗口最大化
size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / 2, (screenheight - height) / 2 - 50)
menuwin.geometry(size)
v_user = tkinter.StringVar()
v_pass = tkinter.StringVar()
v_orcl = tkinter.StringVar()
v_path = tkinter.StringVar()
v_where = tkinter.StringVar()
tkinter.Label(menuwin, text='-------------------------------------oracle连接-------------------------------------',
width=40).grid(padx=10, pady=5, row=0, column=0, columnspan=4, sticky='w')
tkinter.Label(menuwin, text='用户名:', width=10).grid(padx=10, pady=5, row=1, column=0, sticky='w')
tkinter.Entry(menuwin, textvariable=v_user, relief='flat', width=25).grid(padx=10, pady=5, row=1, column=1)
tkinter.Label(menuwin, text='口令:', width=10).grid(padx=10, pady=5, row=2, column=0, sticky='w')
tkinter.Entry(menuwin, textvariable=v_pass, relief='flat', width=25,show='*').grid(padx=10, pady=5, row=2, column=1)
tkinter.Label(menuwin, text='数据库:', width=10).grid(padx=10, pady=5, row=3, column=0, sticky='w')
tkinter.Entry(menuwin, textvariable=v_orcl, relief='flat', width=25).grid(padx=10, pady=5, row=3, column=1)
# 功能1-备份存储过程
tkinter.Label(menuwin, text='-------------------------------------备份oracle存过-------------------------------------',
width=40).grid(padx=10, pady=5, row=4, column=0, columnspan=4, sticky='w')
tkinter.Button(menuwin, text='重置', width=11).grid(padx=10, pady=5, row=5, column=0, sticky='s')
tkinter.Button(menuwin, text='路径', width=24).grid(padx=10, pady=5, row=5, column=1, sticky='s')
tkinter.Entry(menuwin, textvariable=v_path, relief='flat', width=40,state='disabled').grid(padx=10, pady=5, row=6, column=0, columnspan=4)
tkinter.Button(menuwin, text='备份存过',
width=40).grid(padx=10, pady=5, row=7, column=0, columnspan=4, sticky='w')
# 功能2-提取数据
tkinter.Label(menuwin, text='-------------------------------------导出oracle数据-------------------------------------',width=40).grid(padx=10, pady=5, row=8, column=0, columnspan=4, sticky='w')
#选择sql语句导出还是整表导出
ButtonList = IntVar() # IntVar 是tkinter的一个类,可以管理单选按钮
tkinter.Radiobutton(menuwin, variable=ButtonList, value=0, text="表名").grid(padx=10,pady=5,row=9,column=0,sticky = 'w')
tkinter.Radiobutton(menuwin, variable=ButtonList, value=1, text="SQL语句").grid(padx=10,pady=5,row=9,column=1,sticky = 'w')
sqltext=tkinter.Text(menuwin,width=40,height=5,fg = 'black')
sqltext.grid(padx=10, pady=5,row=10, column=0,columnspan=4)
tkinter.Label(menuwin, text='WHERe条件:', width=10).grid(padx=10, pady=5, row=11, column=0, sticky='w')
tkinter.Entry(menuwin, textvariable=v_where, relief='flat', width=25).grid(padx=10, pady=5, row=11, column=1)
#
tkinter.Button(menuwin,text='导出数据',width =40).grid(padx=10, pady=5, row=12, column=0, columnspan=4, sticky='w')
#存储过程保存路径
save_path = ''
# 界面一直显示
menuwin.mainloop()
运行结果如图:
2.按钮,输入框具体的功能以及代码:
1)【路径】【重置】【备份存过】按钮具体的代码如上篇文章。
2)【表名】【SQL语句】,决定下面输入框填写的类型是什么。如果输入表名,如BS_JOB_LOG(自建的日志表),则勾选【表名】;反之如果输入SELECt T.ETL_DT 批量日期, T.PROCNO 存储过程名称, T.TABLNO 目标表名称, T.STDATE 执行开始日期, T.ENDATE 执行结束日期, T.EXECST 批量执行状态, T.ERRESN 批量报错原因, T.INSNUM 入库笔数, T.SUSEDT 总耗时 FROM BS_JOB_LOG T WHERe T.ETL_DT = '20220222'则,勾选【SQL语句】;
3)【WHERe条件】则是针对,勾选表名时,单表数据量过大,且不需要整张表的数据,这时候加上筛选条件,譬如T.ETL_DT = '20220222',此处where省略。
4)【导出数据】,其实就是读取输入框中的表名或者sql语句,以及where条件,然后连接数据库去查询出数据结果,再将数据结果写入excle。这边涉及到写入excle的模块,首先得先安装模块,安装模块,只有打开CMD,输入pip install 模块名,譬如pip install xlwt,等到看到successful基本就ok。下面我们大概了解一下这两个模块:
(a)xlwt
该模块保存的excle文件为.xls格式,且最大行数为65536,所以对于数据量较大的表,这个模块就没法用了,该小工具一开始就用这个模块写的,具体用法大家自行百度。代码如下:
def wr_excle(all_data):
#新建一个excel
book = xlwt.Workbook()
#新建一个sheet页
sheet = book.add_sheet('sheet1')
#写表头
i = 0
for header in title:
sheet.write(0,i,header)
i+=1
#写入数据
for row in range(0,len(all_data)):
for col in range(0,len(all_data[row])):
sheet.write(row+1,col,all_data[row][col])
row+=1
col+=1
getdatetime()
file_name = file_name1+localtime2+".xls"
book.save(file_name)
tkinter.messagebox.showinfo("消息","excle导出成功")
(b)openpyxl
保存的excle格式为.xlsx,且最大行数限制为1048576,基本上是够用了(因为我下过一个60w的数据,结果卡死了,哈哈哈,后面有时间进行性能优化),具体用法大家自行百度。代码如下:
def writetoxlsx(all_data):
outwb = openpyxl.Workbook() # 打开一个将写的文件
#outws = outwb.create_sheet(index=0) # 在将写的文件创建sheet
ws = outwb.active
#写表头
i = 1
for header in title:
ws.cell(row = 1,column=i,value = "%s" % header)
i+=1
for row in range(0,len(all_data)):
for col in range(0,len(all_data[row])):
ws.cell(column=col+1,row=row+2,value = "%s" % all_data[row][col])
row+=1
col+=1
getdatetime()
file_name = file_name1+localtime2+".xlsx"
outwb.save(file_name) # 保存结果
tkinter.messagebox.showinfo("消息","excle导出成功")
3.将写好的代码打包成exe,上篇没有提到如何打包exe,python中有个模块pyinstaller。首先安装模块,上面提到了pip install pyinstaller,然后准备好开发好的脚本(这里也可以添加图标),在脚本页打开Windows PowerShell,输入命令:pyinstaller -F -i 1.ico 2.py --noconsole,等到看到successful基本就ok。关于【pyinstaller】具体用法自行百度啊。一切准备就绪后,开始运行exe:
1)选择【表名】的运行示意图,如图所示:
2)选择【SQL语句】的运行示意图,如图所示::
3)比对一下excle的内容:
数据结果是一致的,但是由于【SQL语句】的不确定性,导致导出的数据表头无法获取,需要手动添加,目前还没有想到好的办法,大家有好的办法也可以提供交流交流。
表数据导出工具可以将一些简单的表数据或者简单sql的数据结果导出成excle,功能上比较简单,实用性也还行吧,哈哈哈。再结合上篇的存储过程备份,小工具已经有了大概的雏形,后续也会继续对小工具进行更新优化,拭目以待。大家有一些比较实用的功能什么的也可以提出来,大家可以一起想办法去实现。
莫愁前路无知己。路漫漫其修远兮。
分享工作学习经验,相交流,共进步。
文中涉及的源代码,以及打包好的exe,可在公众号中回复【004】获得。
最后附上WX公众号:
WX搜索【前路漫漫】



