生成数据库表结构markdown描述文档

如何把数据库表结构生成markdown描述文档

在日常工作中,可能表结构调整,文档没用及时更新,当再次需要更新时,一条条去找就很费时费力,能不能一次性导出我们需要的文档结构呢,当然navicat默认导出的是E-R图,有时候并不符合想要的文档结构图。如果是markdown格式则方便很多,我们甚至可以用markdown文档转为excel批量改成我们想要的文档风格。

生成markdown描述文档效果如下图

在这里插入图片描述

了解原理

1.根据sql查询对应表空间的所有表和表注释
2.遍历1中的所有表名,查出对应的表结构描述信息



-- 查询表空间里面的所有表名和注释
SELECT TABLE_NAME, TABLE_COMMENT  
FROM INFORMATION_SCHEMA.TABLES  
WHERE TABLE_SCHEMA = 'test' 
-- AND TABLE_NAME LIKE 'bas%'; # 可以根据表前缀按指定的模块查询对应表名


-- 查询对应的表结构
SELECT
COLUMN_NAME 列名,
COLUMN_COMMENT 注释 ,
-- COLUMN_TYPE 数据类型,
DATA_TYPE 字段类型, 
CASE WHEN LOCATE('(',COLUMN_TYPE) >0 THEN  SUBSTR(REPLACE(COLUMN_TYPE,')',''),LOCATE('(',COLUMN_TYPE)+1) ELSE  CHARACTER_MAXIMUM_LENGTH END   长度,
CASE  IS_NULLABLE WHEN 'YES' THEN '√' ELSE NULL END 允许空,

COLUMN_DEFAULT 描述 
FROM
INFORMATION_SCHEMA.COLUMNS
where
table_schema ='spd3_herp_dev' AND TABLE_NAME='sys_access_log'

使用python和模板生成markdown文档

这里就直接使用对应的脚本了

1.文档模板template-table


{{#items}}
 ## {{tableName}}{{tableComent}}

| 列名 | 注释 | 字段类型 | 长度 | 允许为空 | 描述 |
|----|----|------|----|------|----|
{{#rowList}}
|  {{columnName}}  | {{columnComment}}   |    {{dataType}}  |  {{dataLength}}  |   {{nullAble}}   |  {{desc}}  |
{{/rowList}}

{{/items}}

2.python3的脚本


# 读取mysql中的表结构生成markDown文档
# author zjcjava
# https://blog.youkuaiyun.com/zjcjava/
# time 25/07/29
 

import mysql.connector
from mysql.connector import Error
import  pystache

renderer = pystache.Renderer()

# 数据库连接配置
config = {
    'host': 'localhost',
    'port': 3306,
    'database': 'test',
    'user': 'root',
    'password': 'root',
   # 'charset': 'utf8mb4',
}


def filterNull(value):
    return value if value is not None else ''


def generate_mysql2md():
    connection = {}
    try:
        # 创建数据库连接
        connection = mysql.connector.connect(
         host= config['host'],        # 数据库地址
         port=3306,               # 数据库端口
         database= config['database'],  # 这里需要指定你要连接的数据库名
         user= config['user'],             # 数据库账号
         password= config['password']        # 数据库密码

        )
        if connection.is_connected():
            print("成功连接到数据库")

        cursor = connection.cursor()
        cursor.execute("SELECT TABLE_NAME, TABLE_COMMENT   FROM INFORMATION_SCHEMA.TABLES   WHERE TABLE_SCHEMA = 'spd3.0' AND TABLE_NAME LIKE 'sys%' AND TABLE_COMMENT !='' ")
        tables = cursor.fetchall()

        # 创建Word文档
        #doc = Document()
        tableList = []
        for index, table in enumerate(tables,start=0):
             table_name=table[0]
             item= {'tableName':table[0],'tableComent':table[1]}
             cursor.execute(F"SELECT COLUMN_NAME 列名, COLUMN_COMMENT 注释 , DATA_TYPE 字段类型, CASE WHEN LOCATE('(',COLUMN_TYPE) >0 THEN  SUBSTR(REPLACE(COLUMN_TYPE,')',''),LOCATE('(',COLUMN_TYPE)+1) ELSE  CHARACTER_MAXIMUM_LENGTH END   长度,CASE  IS_NULLABLE WHEN 'YES' THEN '√' ELSE NULL END 允许空, COLUMN_DEFAULT 描述 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema ='{config['database']}' AND TABLE_NAME='{table_name}' ")

             columns = cursor.fetchall()
             rowList = []
             for  index, row in enumerate(columns,start=0):
                   columnRow = {'columnName':row[0],
                   'columnComment':row[1],
                   'dataType':row[2],
                   'dataLength':row[3],
                   'nullAble': filterNull(row[4]),
                   'desc': filterNull(row[5])
                   }
                   print(columnRow)
                   rowList.append(columnRow)
#              print(rowList)
             item['rowList']= rowList
#              print(item)
             tableList.append(item)


        print("-----------------------------")
        data ={"items": tableList}
        api = open("template-table", "r" ,encoding='utf-8') #用文件作为模板
        api_content=pystache.render(api.read(), data)
        with open('output.txt', 'w',encoding='utf-8') as file:
            file.write(api_content)



    except Error as e:
        print(f"连接失败: {e}")

    finally:
        # 关闭数据库连接
        if connection.is_connected():
            connection.close()
            print("数据库连接已关闭")



#执行脚本入口
generate_mysql2md()

执行后保存为markdown格式即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值