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代码真的很爽
Aug 26 Python
Python深入学习之装饰器
Aug 31 Python
Python编写百度贴吧的简单爬虫
Apr 02 Python
python中requests模块的使用方法
Apr 08 Python
python中的闭包用法实例详解
May 05 Python
python使用htmllib分析网页内容的方法
May 08 Python
200 行python 代码实现 2048 游戏
Jan 12 Python
selenium+python环境配置教程详解
May 28 Python
pyqt5 实现多窗口跳转的方法
Jun 19 Python
Python适配器模式代码实现解析
Aug 02 Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 Python
Python小白不正确的使用类变量实例
May 29 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下统计用户在线时间的一种尝试
2010/08/26 PHP
php结合表单实现一些简单功能的例子
2011/06/04 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
跨浏览器开发经验总结(四) 怎么写入剪贴板
2010/05/13 Javascript
JavaScript编写页面半透明遮罩效果的简单示例
2016/05/09 Javascript
vuejs指令详解
2017/02/07 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
2017/04/13 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
JS 创建对象的模式实例小结
2020/04/28 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python文件操作类操作实例详解
2014/07/11 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
python对文件的操作方法汇总
2020/02/28 Python
Python ini文件常用操作方法解析
2020/04/26 Python
详解如何在PyCharm控制台中输出彩色文字和背景
2020/08/17 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
Tea Collection官网:一家位于旧金山的童装公司
2020/08/07 全球购物
Java程序员常见面试题
2015/07/16 面试题
大三自我鉴定范文
2013/10/05 职场文书
公司营业员的工作总结自我评价
2013/10/05 职场文书
刊首寄语大全
2014/04/11 职场文书
心理健康日活动总结
2014/05/08 职场文书
财务人员担保书
2014/05/13 职场文书
企业晚会策划方案
2014/05/29 职场文书
大学教师个人总结
2015/02/10 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
校园安全学习心得体会
2016/01/18 职场文书
2016秋季运动会开幕词
2016/03/04 职场文书