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 类的继承实例详解
Mar 25 Python
使用python实现tcp自动重连
Jul 02 Python
flask + pymysql操作Mysql数据库的实例
Nov 13 Python
Python实现翻转数组功能示例
Jan 12 Python
Python发展简史 Python来历
May 14 Python
Python实现基于SVM的分类器的方法
Jul 19 Python
在django中图片上传的格式校验及大小方法
Jul 28 Python
python Django里CSRF 对应策略详解
Aug 05 Python
Python参数传递及收集机制原理解析
Jun 05 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
python实现图片批量压缩
Apr 24 Python
pytorch 如何使用float64训练
May 24 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读取flv文件的播放时间长度
2009/09/03 PHP
浅析is_writable的php实现
2013/06/18 PHP
自己写了一个php检测文件编码的函数
2014/04/21 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
JS打开图片另存为对话框实现代码
2012/12/26 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
js获取Get值的方法
2016/09/29 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
小程序实现选择题选择效果
2018/11/04 Javascript
layuiAdmin循环遍历展示商品图片列表的方法
2019/09/16 Javascript
Vue实现点击导航栏当前标签后变色功能
2020/08/19 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
详解Python with/as使用说明
2018/12/13 Python
PyQt5图形界面播放音乐的实例
2019/06/17 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
承诺书样本
2014/08/30 职场文书
党的群众路线教育实践活动查摆剖析材料
2014/10/10 职场文书
2014年校长工作总结
2014/12/11 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
浅析Python中的套接字编程
2021/06/22 Python