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和Ruby中each循环引用变量问题(一个隐秘BUG?)
Jun 04 Python
Python程序设计入门(1)基本语法简介
Jun 13 Python
跟老齐学Python之总结参数的传递
Oct 10 Python
Python通过Pygame绘制移动的矩形实例代码
Jan 03 Python
Python实现图片尺寸缩放脚本
Mar 10 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
pytorch 可视化feature map的示例代码
Aug 20 Python
python pycharm的安装及其使用
Oct 11 Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 Python
python之pymysql模块简单应用示例代码
Dec 16 Python
用pytorch的nn.Module构造简单全链接层实例
Jan 14 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
Jul 13 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
php下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
JS中的log对象获取以及debug的写法介绍
2014/03/03 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
简介JavaScript中setUTCSeconds()方法的使用
2015/06/12 Javascript
详解vue.js组件化开发实践
2016/12/14 Javascript
Vue.js中用webpack合并打包多个组件并实现按需加载
2017/02/17 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
2018/05/03 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
微信小程序连续签到7天积分获得功能的示例代码
2020/08/20 Javascript
[55:16]Mski vs VGJ.S Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
python简单程序读取串口信息的方法
2015/03/13 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
Python QTimer实现多线程及QSS应用过程解析
2020/07/11 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
CSS3 Media Queries(响应式布局可以让你定制不同的分辨率和设备)
2013/06/06 HTML / CSS
HTML5 video播放器全屏(fullScreen)方法实例
2015/04/24 HTML / CSS
PHP如何与mysql建立链接
2013/05/05 面试题
浙大毕业生自荐信
2014/01/26 职场文书
冰淇淋开店创业计划书
2014/02/01 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
小学总务工作总结
2015/08/13 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
MongoDB数据库常用的10条操作命令
2021/06/18 MongoDB
Redis集群的关闭与重启操作
2021/07/07 Redis
vue router 动态路由清除方式
2022/05/25 Vue.js
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技