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中 ? : 三元表达式的使用介绍
Oct 09 Python
python选择排序算法的实现代码
Nov 21 Python
详解Python的Django框架中的通用视图
May 04 Python
在django中使用自定义标签实现分页功能
Jul 04 Python
Python实现的快速排序算法详解
Aug 01 Python
20个常用Python运维库和模块
Feb 12 Python
tensorflow实现简单的卷积网络
May 24 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
使用Python控制摄像头拍照并发邮件
Apr 23 Python
keras做CNN的训练误差loss的下降操作
Jun 22 Python
python Gabor滤波器讲解
Oct 26 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压缩和解压缩字符串的方法
2015/03/14 PHP
php基于websocket搭建简易聊天室实践
2016/10/24 PHP
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
javaScript中的this示例学习详解及工作原理
2014/01/13 Javascript
jQuery插件开发详细教程
2014/06/06 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
用jquery快速解决IE输入框不能输入的问题
2016/10/04 Javascript
jQuery实现手机上输入后隐藏键盘功能
2017/01/04 Javascript
Node.js中用D3.js的方法示例
2017/01/16 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
小程序识别身份证,银行卡,营业执照,驾照的实现
2019/11/05 Javascript
webpack优化之代码分割与公共代码提取详解
2019/11/22 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
python实现跨文件全局变量的方法
2014/07/07 Python
Python编程中time模块的一些关键用法解析
2016/01/19 Python
python模块之paramiko实例代码
2018/01/31 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
python实现两个dict合并与计算操作示例
2019/07/01 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
通过实例了解python__slots__使用方法
2020/09/14 Python
皮姆斯勒语言学习:Pimsleur Language Programs
2018/06/30 全球购物
法国低价在线宠物商店:bitiba.fr
2020/07/03 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
params有什么用
2016/03/01 面试题
洗发水广告词
2014/03/13 职场文书
小露珠教学反思
2014/04/30 职场文书
2015年销售工作总结范文
2015/03/30 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
小学教师教育随笔
2015/08/14 职场文书
一文搞懂Redis中String数据类型
2022/04/03 Redis