python自动生成sql语句的脚本


Posted in Python onFebruary 24, 2021

描述:
工作中在数据库中创建表时,当字段很多时,比较麻烦,开发一个工具,可在excel中写好字段英文名和中文名,然后通过py生成脚本或直接在库中生成表
脚本:

import tkinter
from tkinter import *
import tkinter.messagebox
from tkinter import scrolledtext
import xlrd
import pymysql
import os

#从excel中获取字段项,组合建表语句
def get_create_sql(dir_path, file_name):
 try:
  # 打开xls文件
  #excel_path = "%s%s" % (dir_path, file_name)
  #print("excel_path:",excel_path)
  wb = xlrd.open_workbook(filename=dir_path)
  # 打开第一sheet
  ws = wb.sheets()[0]
  #获取行列数量
  nrows = ws.nrows
  #ncols = ws.ncols
  #获取sheet1的名称
  table_name = ws.name
  #print("nrows:",nrows)
  #print("ncols:",ncols)
  #print("sheet1_name:",table_name)
  #xlrd中行列是从0开始的
  for i in range(nrows):
   if i == 0: #字段英文,格式是列表
    row0_data = ws.row_values(0)
    #print(row0_data)
   if i == 1: #字段中文,格式是列表
    row1_data = ws.row_values(1)
    #print(row1_data)
  #将含有-字符的替换
  header0 = [str(i).replace("-", "_").replace("-", "_").replace("(", "_").replace(")", "") for i in row0_data]
  #print("header0:",header0)
  header1 = [str(i).replace("-", "_").replace("-", "_").replace("(", "_").replace(")", "") for i in row1_data]
  #print("header1:",header1)
  #获取表名
  table_commet = file_name.split(".")[0]
  #print("table_name:",table_name)
  create_sql = "CREATE TABLE `%s` (\n" % table_name
  #print("create_sql:",create_sql)
  header0_len = len(header0)
  #print("header0_len:",header0_len)
  for i in range(header0_len):
   #print("i:", i,"value:",header0[i])
   if i < header0_len-1:
    create_sql += "`%s` varchar(255) DEFAULT NULL COMMENT '%s',\n" % (header0[i], header1[i])
   if i == header0_len-1:
    create_sql += "`%s` varchar(255) DEFAULT NULL COMMENT '%s'\n" % (header0[i], header1[i])
  create_sql += ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='%s';\n" % table_commet
  #print("[INFO]:[create_sql]", create_sql)
 except BaseException as e:
  #print("[ERRO]:", str(e))
  tkinter.messagebox.showerror('错误', str(e))
 return create_sql

def to_db(create_sql,hostname,hostport,username,userpasswd,dbname):
 #链接数据库,执行
 #print(hostname,hostport,username,userpasswd,dbname)
 try:
  db = pymysql.connect(host=hostname, port=hostport, user=username, passwd=userpasswd, db=dbname)
  cursor = db.cursor()
  cursor.execute(create_sql)
  cursor.fetchall()
  db.close()
  #print("表创建成功!")
  tkinter.messagebox.showinfo('提示', '表创建成功 !')
 except BaseException as e:
  #print("表创建失败!", str(e))
  tkinter.messagebox.showerror('错误', str(e))

# get 变量内容
def show_db():
 if v1.get() == '' or v2.get() == '' or v3.get() == '' or v4.get() == '' or v5.get() == '' or v6.get() == '':
  tkinter.messagebox.showinfo('提示', '请先输入内容 !')
  return
 if v1.get() == 'token**123':
  tkinter.messagebox.showinfo('提示', 'author by lijiyan 2020-12-03,Thank you.')
  return
 #print("文件路径名 :%s" % e1.get())
 #print("数据库IP :%s" % e2.get())
 #print("数据库端口 :%s" % e2.get())
 #print("库名 :%s" % e2.get())
 #print("用户名 :%s" % e2.get())
 #print("密码 :%s" % e2.get())
 #easygui.msgbox('执行完成 !')
 dir_pathname = e1.get()
 #dir_pathi = os.path.dirname(dir_pathname)
 file_namei = os.path.basename(dir_pathname)
 #print(dir_pathname,file_namei)

 create_sql = get_create_sql(dir_path=dir_pathname,
        file_name=file_namei
        )

 to_db(create_sql=create_sql,
   hostname=e2.get(),
   hostport=int(e3.get()),
   dbname=e4.get(),
   username=e5.get(),
   userpasswd=e6.get()
   )

def show_sql():
 if v1.get() == '':
  tkinter.messagebox.showinfo('提示', '请先输入内容 !')
  return
 #print("文件路径名 :%s" % e1.get())
 dir_pathname = e1.get()
 # dir_pathi = os.path.dirname(dir_pathname)
 file_namei = os.path.basename(dir_pathname)
 # print(dir_pathname,file_namei)

 create_sql = get_create_sql(dir_path=dir_pathname,
        file_name=file_namei
        )
 #tkinter.messagebox.showinfo('提示', create_sql)
 t.delete(1.0, END)
 t.insert('insert', create_sql)
 #e8.insert('insert',create_sql)
 #这个可以,但样式难看
 #Label(top, text=create_sql,wraplength=200).grid(row=8,column=0,sticky=W+E+N+S,padx=5,pady=5,rowspan=7,columnspan=2)

#初始框的声明
top = tkinter.Tk()
top.title("生成createsql工具v1.0")
top.geometry("400x300+300+200")
## 标签控件,对Label内容进行 表格式 布局
Label(top,text='文件路径名 :').grid(row=0, column=0)
Label(top,text='数据库IP :').grid(row=2,column=0)
Label(top,text='数据库端口 :').grid(row=3,column=0)
Label(top,text='库名 :').grid(row=4,column=0)
Label(top,text='用户名 :').grid(row=5,column=0)
Label(top,text='密码 :').grid(row=6,column=0)
#Label(top,text='sql :').grid(row=0,column=1)
#定义变量
v1 = StringVar()
v2 = StringVar()
v3 = StringVar()
v4 = StringVar()
v5 = StringVar()
v6 = StringVar()
#v8 = StringVar()
# 输入控件,用于储存 输入的内容
e1 = Entry(top, textvariable=v1)
e2 = Entry(top, textvariable=v2)
e3 = Entry(top, textvariable=v3)
e4 = Entry(top, textvariable=v4)
e5 = Entry(top, textvariable=v5)
e6 = Entry(top, textvariable=v6, show="*")
#e8 = Entry(top, textvariable=v8)

# 进行表格式布局
e1.grid(row=0,column=1,padx=10,pady=5)
e2.grid(row=2,column=1,padx=10,pady=5)
e3.grid(row=3,column=1,padx=10,pady=5)
e4.grid(row=4,column=1,padx=10,pady=5)
e5.grid(row=5,column=1,padx=10,pady=5)
e6.grid(row=6,column=1,padx=10,pady=5)
#e8.grid(row=0,column=2,sticky=W+E+N+S,padx=5,pady=5,rowspan=7,columnspan=2)

#文本内容较大,滚动文本框,展示文本内容
t = scrolledtext.ScrolledText(top,width = 20,height = 20,wrap=WORD)
t.grid(row=0,column=2,rowspan=7,columnspan=2)

# 设置 button 指定 宽度 , 并且 关联 函数 , 使用表格式布局 .
Button(top,text='生成sql',width=10,command=show_sql).grid(row=1,column=1,sticky=E,padx=10,pady=5)
Button(top,text='入库',width=10,command=show_db).grid(row=7,column=1,sticky=W,padx=10,pady=5)
Button(top,text='退出',width=10,command=top.quit).grid(row=7,column=1,sticky=E,padx=10,pady=5)

mainloop()

打包生成工具:
在资源栏

excel说明:
第一行,表字段英文名称
第二行,表字段中文名称
第三行,表数据,可不写

到此这篇关于python自动生成sql语句的脚本的文章就介绍到这了,更多相关python自动生成sql语句内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python使用clear方法清除字典内全部数据实例
Jul 11 Python
python目录与文件名操作例子
Aug 28 Python
无法使用pip命令安装python第三方库的原因及解决方法
Jun 12 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
python读写csv文件方法详细总结
Jul 05 Python
对django后台admin下拉框进行过滤的实例
Jul 26 Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 Python
python第三方库学习笔记
Feb 07 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
Mar 05 Python
让Django的BooleanField支持字符串形式的输入方式
May 20 Python
win10安装python3.6的常见问题
Jul 01 Python
python输出国际象棋棋盘的实例分享
Nov 26 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 #Python
一文读懂python Scrapy爬虫框架
Feb 24 #Python
Django如何重置migration的几种情景
Feb 24 #Python
Django中的DateTimeField和DateField实现
Feb 24 #Python
Python制作运行进度条的实现效果(代码运行不无聊)
Feb 24 #Python
学点简单的Django之第一个Django程序的实现
Feb 24 #Python
python单例模式的应用场景实例讲解
Feb 24 #Python
You might like
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
一个用php实现的获取URL信息的类
2007/01/02 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
php 抽象类的简单应用
2011/09/06 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
使用命令对象代替switch语句的写法示例
2015/02/28 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
基于JS实现横线提示输入验证码随验证码输入消失(js验证码的实现)
2016/10/27 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
jQuery电话号码验证实例
2017/01/05 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
Vue双向绑定实现原理与方法详解
2020/05/07 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
[36:02]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第一局
2016/02/28 DOTA
python机器学习理论与实战(六)支持向量机
2018/01/19 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
2018/09/14 Python
python的移位操作实现详解
2019/08/21 Python
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
Farfetch中文官网:奢侈品牌时尚购物平台
2020/03/15 全球购物
社区交通安全实施方案
2014/03/22 职场文书
大学应届毕业生求职信
2014/05/24 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
2014年妇女工作总结
2014/12/06 职场文书
帮你提高开发效率的JavaScript20个技巧
2021/06/18 Javascript
使用python创建股票的时间序列可视化分析
2022/03/03 Python