序言
上次谈到了GUI框架tkinter,今天就基于这个模块,开发一个工作中用到的小工具。备份存储过程的小工具。
背景
案例分析第三课-备份存储过程小工具
前一段时间由于项目组服务器崩了,导致测试环境数据库无了,脚本也没了,之前备份在数据库表数据中的脚本也都没了,并且没法恢复了。所以就想着可以将脚本备份到本地电脑上了啊,借用工具(PLSQL Developer)来备份啊,但是用过这个工具的人可能清楚,备份的话可能需要以下几步:
1.选择【工具】
2.选择【导出用户对象】
3.选择需要导出的存储过程
4.选择需要导出的文件路径
5.点击导出
也不是说麻烦吧,可能需要花费一点时间,所以就在想开发一个小工具,可以用来备份存储过程,稍微简单一丢丢也行。
思路
首先构思一下界面,因为需要登录数据库,所以需要用户名,口令,数据库实例,然后选择路径,以及开始备份的按钮。
根据大概的构思,大概界面分析如图所示:
代码及解析
根据上面的界面,用tkinter开始编写代码(建议先看看关于tkinter模块的具体用法):
1.先得写出这个界面,代码如下:
import tkinter
menuwin = tkinter.Tk()
menuwin.title('QfTool')
screenwidth = menuwin.winfo_screenwidth()
screenheight = menuwin.winfo_screenheight()
width = 315
height = 280
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')
#存储过程保存路径
save_path = ''
# 界面一直显示
menuwin.mainloop()
运行结果如图:
2.给各个按钮添加对应的功能:
1)【路径】选择需要备份的路径,代码如下:
def selectPath():
global save_path
save_path = askdirectory() #选择的路径就是文件保存的路径
v_path.set(save_path) #并将选择的路径显示在备份存过上面一行
2)【重置】清除显示的路径,其实这个按钮可有可无,代码如下:
def textjs():
global save_path
save_path=''
v_path.set('')
3)【备份存过】从数据库中查询出存储过程,然后将查询的结果存储到列表中去,再讲列表中的结果一一写入文件中并保存,就得到我们最后备份好的存储过程了:
def get_proc(connect):
# 连接数据库
conn_text = connect
conn = cx_Oracle.connect(conn_text)
# 获取cursor()
cursor = conn.cursor()
# 使用cursor()操作查询
sql = "SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = 'PROCEDURE'"
result = cursor.execute(sql)
proclist = result.fetchall()
for i in proclist:
procname = i[0]
conn = cx_Oracle.connect(conn_text)
cursor = conn.cursor()
sql = "SELECT DBMS_METADATA.GET_DDL('PROCEDURE','" + procname + "') FROM DUAL"
result = cursor.execute(sql)
textlob = result.fetchall()
pram = []
for i in textlob:
text = i[0].read()
pram.append(text)
write_text(procname, pram)
cursor.close()
# 关闭数据库连接
conn.close()
def write_text(procname, text):
save_file = save_path + '\\' + procname + '.txt'
file = open(save_file, 'w', encoding='utf-8')
file.writelines(text)
file.close()
3.将写好的代码打包成exe,执行exe,看运行结果。
1)准备运行前,如图所示:
2)运行后,如图所示:
备份完成,不选择路径的话,会默认存放在【E盘/当日日期(YYYYMMDD)/用户名】。
跋文
备份存储过程小工具只是一个简单的备份存过的小工具,后面也可以将建表语句啊什么的添加进去,或者可以保存输入的用户名口令数据库等,方便下次使用,都是有待优化升级的,大家也可以集思广益一起交流交流,提出宝贵的意见。
莫愁前路无知己。路漫漫其修远兮。
分享工作学习经验,相交流,共进步。
文中涉及的源代码,以及打包好的exe,可在公众号中回复【003】获得。
最后附上WX公众号:
WX搜索【前路漫漫】