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写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
Python一个简单的通信程序(客户端 服务器)
Mar 06 Python
Python3+Appium安装使用教程
Jul 05 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
Python程序控制语句用法实例分析
Jan 14 Python
tensorflow 实现自定义layer并添加到计算图中
Feb 04 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
Python ellipsis 的用法详解
Nov 20 Python
OpenCV图像变换之傅里叶变换的一些应用
Jul 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
PHP5.3的垃圾回收机制(动态存储分配方案)深入理解
2012/12/10 PHP
PHP 微信支付类 demo
2015/11/30 PHP
微信自定义分享php代码分析
2016/11/24 PHP
php微信扫码支付 php公众号支付
2019/03/24 PHP
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
如何让你的Lightbox支持滚轮缩放及Base64图片
2014/12/04 Javascript
javascript中SetInterval与setTimeout的定时器用法
2015/08/24 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
jquery遍历table的tr获取td的值实现方法
2016/05/19 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
echarts统计x轴区间的数值实例代码详解
2019/07/07 Javascript
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
python登陆asp网站页面的实现代码
2015/01/14 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
Python爬虫爬取ts碎片视频+验证码登录功能
2021/02/22 Python
利用python实现汉诺塔游戏
2021/03/01 Python
zooplus意大利:在线宠物商店
2019/08/07 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
高二生物教学反思
2014/01/27 职场文书
竞选学生会演讲稿
2014/04/25 职场文书
业务内勤岗位职责
2014/04/30 职场文书
IT工程师岗位职责
2014/07/04 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
MySQL注入基础练习
2021/05/30 MySQL
Java实现聊天机器人完善版
2021/07/04 Java/Android
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL