Python3自动生成MySQL数据字典的markdown文本的实现


Posted in Python onMay 07, 2020

为啥要写这个脚本

五一前的准备下班的时候,看到同事为了做数据库的某个表的数据字典,在做一个复杂的人工操作,就是一个字段一个字段的纯手撸,那速度可想而知是多么的折磨和锻炼人的意志和耐心,反正就是很耗时又费力的活,关键是工作效率太低了,于是就网上查了一下,能否有在线工具可用,但是并没有找到理想和如意的,于是吧,就干脆自己撸一个,一劳永逸,说干就干的那种……

先屡一下脚本思路

第一步:输入或修改数据库连接配置信息,以及输入数据表名

第二步:利用pymysql模块连接数据库,并判断数据表是否存在

第三步:获取数据表的注释

第四步:存储文件夹和文件处理,删除已存在的文件避免重复写入

第五步:先写入Markdown的表头部信息

第六步:从information_schema中查询表结构和相关信息

第七步:依次拼装每个字段的Markdown文本写入,结束并关闭相关连接

运行环境

Python运行环境:Windows + python3.6
用到的模块:pymysql、os、time、pyinstaller
如未安装的模块,请使用pip instatll xxxxxx进行安装,例如:pip install pyinstaller

获取数据库连接信息的两种方式

然是要做数据字典,那么肯定就需要先连接数据库,而连接数据库,自然就需要先知道数据库的基本信息:IP地址、用户名、登录密码、数据库名等……

为了方便,我这里写了两种配置MySQL连接的方法:第一种是直接配置在代码里,直接修改代码里的连接信息就可以了;另外一种就是通过手动输入链接信息,不用修改代码,方便快速多用。具体的完整源码,我都上传到同性交友网站GitHub了,可以点下面的链接查看……

  • 修改代码的完整源码:data_dict_config.py
  • 手动输入的完整源码:data_dict_input.py

生成可执行文件

为了方便不同的人群方便快速的使用,可以不用安装Python环境来执行py脚本文件,我把相关脚本打包成Windows可直接执行的exe文件,下载双击运行即可(可能有的系统需要管理员权限运行),打包的方式很简单,就是利用pyinstaller模块进行快速打包,省时省力,具体更多用法大家可以网上查一下。

打包命令为: pyinstaller -F -i favicon.ico data_dict_input.py

执行这个命令后,就会在当前目录下生成一个dict和其他的文件夹和相关文件,其中,打开dict,下面会生成一个文件名相同的exe文件data_dict_input.exe,双击这个文件就可以打开了,拷贝到其他地方一样可以使用。

下面我把两种方式的脚本,都生成了exe可执行文件,大家可以直接点击下载试用,如果下载不了,请直接去GitHub仓库下载或者自己生成

  • 修改代码的可执行文件:data_dict_config.exe
  • 手动输入的可执行文件:data_dict_input.exe

完整代码

为了方便部分人想偷懒,不直接去交友网站查看,我在这里也贴一下其中的一个源码出来吧(其实吧,我是觉得文章篇幅有点短,来凑字数的,大家明白就好,看透不说透)。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
自动生成MySQL数据表的数据字典支持多个
自动获取数据库连接信息,方便多用
author: gxcuizy
date: 2020-04-30
"""

import pymysql
import os
import time


class DataDict(object):
 def __init__(self, connect_info):
 # 数据库连接配置
 self.host_name = connect_info[0]
 self.user_name = connect_info[1]
 self.pwd = connect_info[2]
 self.db_name = connect_info[3]
 self.folder_name = 'mysql_dict'

 def run(self, table_str):
 """脚本执行入口"""
 try:
  # 创建一个连接
  conn = pymysql.connect(self.host_name, self.user_name, self.pwd, self.db_name)
  # 用cursor()创建一个游标对象
  cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
 except Exception:
  print('数据库连接失败,请检查连接信息!')
  exit(1)
 table_list = table_str.split(',')
 for table_name in table_list:
  # 判断表是否存在
  sql = "SHOW TABLES LIKE '%s'" % (table_name,)
  cursor.execute(sql)
  result_count = cursor.rowcount
  if result_count == 0:
  print('%s数据库中%s表名不存在,无法生成……' % (self.db_name, table_name))
  continue
  # 表注释获取
  print('开始生成表%s的数据字典' % (table_name,))
  sql = "show table status WHERE Name = '%s'" % (table_name,)
  cursor.execute(sql)
  result = cursor.fetchone()
  table_comment = result['Comment']
  # 文件夹和文件处理
  file_path = self.folder_name + os.sep + table_name + '.md'
  self.deal_file(file_path)
  # 打开文件,准备写入
  dict_file = open(file_path, 'a', encoding='UTF-8')
  dict_file.write('#### %s %s' % (table_name, table_comment))
  dict_file.write('\n | 字段名称 | 字段类型 | 默认值 | 字段注释 |')
  dict_file.write('\n | --- | --- | --- | --- |')
  # 表结构查询
  field_str = "COLUMN_NAME,COLUMN_TYPE,COLUMN_DEFAULT,COLUMN_COMMENT"
  sql = "select %s from information_schema.COLUMNS where table_schema='%s' and table_name='%s'" % (field_str, self.db_name, table_name)
  cursor.execute(sql)
  fields = cursor.fetchall()
  for field in fields:
  column_name = field['COLUMN_NAME']
  column_type = field['COLUMN_TYPE']
  column_default = str(field['COLUMN_DEFAULT'])
  column_comment = field['COLUMN_COMMENT']
  info = ' | ' + column_name + ' | ' + column_type + ' | ' + column_default + ' | ' + column_comment + ' | '
  dict_file.write('\n ' + info)
  # 关闭连接
  print('完成表%s的数据字典' % (table_name,))
  dict_file.close()
 cursor.close()
 conn.close()

 def deal_file(self, file_name):
 """处理存储文件夹和文件"""
 # 不存在则创建文件夹
 if not os.path.exists(self.folder_name):
  os.mkdir(self.folder_name)
 # 删除已存在的文件
 if os.path.isfile(file_name):
  os.unlink(file_name)

 def test_conn(self, conn_info):
 """测试数据库连接"""
 try:
  # 创建一个连接
  pymysql.connect(conn_info[0], conn_info[1], conn_info[2], conn_info[3])
  return True
 except Exception:
  return False


# 程序执行入口
if __name__ == '__main__':
 # 数据数据连接信息
 conn_info = input('请输入mysql数据库连接信息(格式为:主机IP,用户名,登录密码,数据库名),逗号分隔且输入顺序不能乱,例如:192.168.0.1,root,root,test_db:')
 conn_list = conn_info.split(',')
 while conn_info == '' or len(conn_list) != 4:
 conn_info = input('请正确输入mysql数据库连接信息(格式为:主机IP,用户名,登录密码,数据库名),逗号分隔且输入顺序不能乱,例如:192.168.0.1,root,root,test_db:')
 conn_list = conn_info.split(',')
 # 测试数据库连接问题
 dd_test = DataDict(conn_list)
 db_conn = dd_test.test_conn(conn_list)
 while db_conn == False:
 conn_info = input('请正确输入mysql数据库连接信息(格式为:主机IP,用户名,登录密码,数据库名),逗号分隔且输入顺序不能乱,例如:192.168.0.1,root,root,test_db:')
 conn_list = conn_info.split(',')
 if len(conn_list) != 4:
  continue
 dd_test = DataDict(conn_list)
 db_conn = dd_test.test_conn(conn_list)
 # 输入数据表名称
 table_s = input('请输入数据库表名(例如:t_order),如需输入多个表名请用英文逗号分隔(例如:t_order,t_goods),结束使用请输入q:')
 dd = DataDict(conn_list)
 while table_s != 'q':
 dd.run(table_s)
 table_s = input('继续使用请输入数据库表名(例如t_order),如需输入多个表名请用英文逗号分隔(例如t_order,t_goods),结束使用请输入q):')
 else:
 print('谢谢使用,再见……')
 time.sleep(1)

最后

到此这篇关于Python3自动生成MySQL数据字典的markdown文本的实现的文章就介绍到这了,更多相关Python3自动生成markdown文本内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
基python实现多线程网页爬虫
Sep 06 Python
python类:class创建、数据方法属性及访问控制详解
Jul 25 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
Apr 08 Python
pandas数据预处理之dataframe的groupby操作方法
Apr 13 Python
python实现猜单词小游戏
May 22 Python
Mac下Anaconda的安装和使用教程
Nov 29 Python
用python脚本24小时刷浏览器的访问量方法
Dec 07 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
用Python进行websocket接口测试
Oct 16 Python
基于Django快速集成Echarts代码示例
Dec 01 Python
python 用pandas实现数据透视表功能
Dec 21 Python
Python中super().__init__()测试以及理解
Dec 06 Python
如何搭建pytorch环境的方法步骤
May 06 #Python
Python基于Tkinter编写crc校验工具
May 06 #Python
使用Python实现批量ping操作方法
May 06 #Python
Python super()函数使用及多重继承
May 06 #Python
python中shell执行知识点
May 06 #Python
Python 通过监听端口实现唯一脚本运行方式
May 05 #Python
python2.7使用scapy发送syn实例
May 05 #Python
You might like
JS实现php的伪分页
2008/05/25 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
尝试在让script的type属性等于text/html
2013/01/15 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
JS & JQuery 动态添加 select option
2016/06/08 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
JavaScript之map reduce_动力节点Java学院整理
2017/06/29 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
javascript实现留言板功能
2020/02/08 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
2020/07/21 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:03]PWL开团时刻DAY6——别打我
2020/11/05 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
python使用百度翻译进行中翻英示例
2014/04/14 Python
图文详解WinPE下安装Python
2016/05/17 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
2016/07/01 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
Python面向对象编程基础实例分析
2020/01/17 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
CSS3属性box-sizing使用指南
2014/12/09 HTML / CSS
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
学历公证书范本
2014/04/09 职场文书
10的分与合教学反思
2014/04/30 职场文书
物业保安岗位职责
2014/07/02 职场文书
竞选班干部演讲稿100字
2014/08/20 职场文书
股东出资证明书(正规版)
2014/09/24 职场文书
数学备课组工作总结
2015/08/12 职场文书
校园安全教育心得体会
2016/01/15 职场文书
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫