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 OS模块常用函数说明
May 23 Python
Python实现的简单算术游戏实例
May 26 Python
Python常用小技巧总结
Jun 01 Python
在Django的通用视图中处理Context的方法
Jul 21 Python
Python socket实现简单聊天室
Apr 01 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
set在python里的含义和用法
Jun 24 Python
解决python3 requests headers参数不能有中文的问题
Aug 21 Python
通过python扫描二维码/条形码并打印数据
Nov 14 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
python如何快速拼接字符串
Oct 28 Python
python regex库实例用法总结
Jan 03 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
PHP strtotime函数详解
2009/12/18 PHP
php 注册时输入信息验证器的实现详解
2013/07/05 PHP
php命令行使用方法和命令行参数说明
2014/04/08 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
2015/10/10 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
JS查看对象功能代码
2008/04/25 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
JS+CSS实现感应鼠标渐变显示DIV层的方法
2015/02/20 Javascript
jQuery滚动新闻实现代码
2016/06/26 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
JavaScript面向对象精要(上部)
2017/09/12 Javascript
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
详解VS Code使用之Vue工程配置format代码格式化
2019/03/20 Javascript
Angular封装搜索框组件操作示例
2019/04/25 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
python将文本转换成图片输出的方法
2015/04/28 Python
Python如何获取系统iops示例代码
2016/09/06 Python
Python实现的快速排序算法详解
2017/08/01 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
英文翻译的自我评价语句
2013/10/04 职场文书
网上快餐厅创业计划书
2014/02/01 职场文书
社团活动总结格式
2014/08/29 职场文书
企业工会工作总结2015
2015/05/13 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
投诉信范文
2015/07/02 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL