如何把数据库表结构生成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格式即可