闲不住,手写一个数据库文档生成工具

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。
个人IP:shigen

逛博客的时候,发现了一个很有意思的文章:数据库表结构导出工具。带着好奇,我也去DIY了一个,先看看效果:

实现效果

这个就是主要的程序界面,可以选择生成md文档或者docx文档。具体的文档内容如下:

md文档

md文档内容

docx文档

docx文档

功能可以成功的实现,现在我们来分析一下原理,核心就是几条sql语句:

use security;show tables;desc dict;
show full columns from dict where field = 'is_del';

原理分析

查看全部的表

查看全部的表

使用show tables就可以看到当前数据库下边的所有的数据表。

查看表结构

查看表结构

使用desc xxx即可查看表的详细结构,包含字段的全部信息。

查看字段注释

字段的注释需要额外的sql了:

字段注释

当然,shigen也看到过连表查询出字段的注释的,可以进一步的改进。

总结

做一波小总结:其实数据库文档生成,就是用一些sql语句获得对应的表信息和字段信息,使用文本拼接写入到文件里。

代码分享

那本次设计的代码也在这里,欢迎大家学习交流:

from tkinter import *
from tkinter import messageboximport mysql.connector
from docx import Document
from tabulate import tabulate# 连接到MySQL数据库
def connect_to_database():host = host_entry.get()user = user_entry.get()password = password_entry.get()database = database_entry.get()try:conn = mysql.connector.connect(host=host,port=3306,user=user,password=password,database=database)return connexcept mysql.connector.Error as err:messagebox.showerror("错误", f"连接到MySQL数据库时出错:{err}")return None# 获取数据库中的表信息及字段注释
def get_table_info(conn):tables_info = []if conn:cursor = conn.cursor()cursor.execute("SHOW TABLES")tables = cursor.fetchall()for table in tables:table_name = table[0]cursor.execute(f"DESCRIBE {table_name}")table_structure = cursor.fetchall()tables_info.append({"table_name": table_name,"structure": table_structure})cursor.close()return tables_info# 获取字段注释
def get_field_comment(table_name, field_name):cursor = conn.cursor()cursor.execute(f"SHOW FULL COLUMNS FROM {table_name} WHERE Field = '{field_name}'")column_info = cursor.fetchone()comment = column_info[8]  # 注释信息在第9个元素中cursor.close()return comment# 生成Markdown格式的数据库文档
def generate_markdown_documentation(tables_info):documentation = "# 数据库文档\n\n"documentation += f"数据库地址:{host_entry.get()}\n"documentation += f"用户名:{user_entry.get()}\n"documentation += f"数据库名称:{database_entry.get()}\n\n"for table_info in tables_info:table_name = table_info["table_name"]structure = table_info["structure"]documentation += f"## {table_name}\n\n"headers = ["字段", "类型", "允许空值", "键", "默认值", "额外信息", "注释"]  # 添加注释列rows = []for field_info in structure:rows.append(list(field_info) +[get_field_comment(table_name, field_info[0])])  # 获取字段注释并添加到行中documentation += tabulate(rows, headers, tablefmt="pipe") + "\n\n"return documentation# 生成docx格式的数据库文档
def generate_docx_documentation(tables_info):doc = Document()doc.add_heading('数据库文档', 0)doc.add_paragraph(f"数据库地址:{host_entry.get()}")doc.add_paragraph(f"用户名:{user_entry.get()}")doc.add_paragraph(f"数据库名称:{database_entry.get()}")for table_info in tables_info:table_name = table_info["table_name"]structure = table_info["structure"]doc.add_heading(table_name, level=1)# 创建带边框的表格table = doc.add_table(rows=1, cols=7)table.style = 'Table Grid'  # 设置表格样式为带边框的样式table.autofit = False  # 禁止自动调整列宽hdr_cells = table.rows[0].cellshdr_cells[0].text = '字段'hdr_cells[1].text = '类型'hdr_cells[2].text = '允许空值'hdr_cells[3].text = '键'hdr_cells[4].text = '默认值'hdr_cells[5].text = '额外信息'hdr_cells[6].text = '注释'  # 添加注释列for field_info in structure:row_cells = table.add_row().cellsrow_cells[0].text = field_info[0]row_cells[1].text = field_info[1]row_cells[2].text = field_info[2]row_cells[3].text = field_info[3]row_cells[4].text = field_info[4] if field_info[4] is not None else ""row_cells[5].text = field_info[5]row_cells[6].text = get_field_comment(table_name,field_info[0])  # 获取并显示字段注释return doc# 创建标签和输入框
def create_input_fields(root, fields):entries = {}for row, (label_text, entry_text) in enumerate(fields):label = Label(root, text=label_text)label.grid(row=row, column=0, padx=10, pady=10, sticky="w")entry = Entry(root)entry.grid(row=row, column=1, padx=10, pady=10)entry.insert(0, entry_text)entries[label_text] = entry# 添加文档类型选择器label = Label(root, text="文档类型:")label.grid(row=len(fields), column=0, padx=10, pady=10, sticky="w")doc_type = StringVar(root)doc_type.set("Markdown")  # 默认选择 Markdowndoc_type_menu = OptionMenu(root, doc_type, "Markdown", "Docx")doc_type_menu.grid(row=len(fields), column=1, padx=10, pady=10, sticky="w")entries["文档类型:"] = doc_typereturn entries# 生成文档
def generate_document():global conn  # 在函数内部使用全局变量 connconn = connect_to_database()if conn:tables_info = get_table_info(conn)if entries["文档类型:"].get() == "Markdown":  # 获取文档类型documentation = generate_markdown_documentation(tables_info)with open("数据库文档.md", "w", encoding="utf-8") as file:file.write(documentation)messagebox.showinfo("成功", "Markdown文档生成成功!")elif entries["文档类型:"].get() == "Docx":doc = generate_docx_documentation(tables_info)doc.save("数据库文档.docx")messagebox.showinfo("成功", "Docx文档生成成功!")# 创建主窗口
root = Tk()
root.title("数据库文档生成器")
root.geometry("400x300")# 标签和输入框的内容
fields = [("主机地址:", ""), ("用户名:", ""), ("密码:", ""), ("数据库名称:", "")]# 创建标签和输入框
entries = create_input_fields(root, fields)# 获取输入框的内容
host_entry = entries["主机地址:"]
user_entry = entries["用户名:"]
password_entry = entries["密码:"]
database_entry = entries["数据库名称:"]# 生成文档按钮
generate_button = Button(root, text="生成文档", command=generate_document)
generate_button.grid(row=len(fields) + 1, columnspan=2, padx=10, pady=10)root.mainloop()

与shigen一起,每天不一样!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/822324.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

xxl-job使用自动注册节点,ip不对,如何解决????

很明显这时我们本机的ip和我们xxl-job自动注册的ip是不一致的,此时该如何处理呢???? 方法一:在配置文件中,将我们的ip固定写好。 ### xxl-job executor server-info xxl.job.executor.ip写你的…

解决EasyPoi导入Excel获取不到第一列的问题

文章目录 1. 复现错误2. 分析错误2.1 导入的代码2.2 DictExcel实体类2.2 表头和标题3. 解决问题1. 复现错误 使用EasyPoi导入数据时,Excel表格如下图: 但在导入时,出现如下错误: name为英文名称,在第一列,Excel表格有值,但导入的代码中为null,就很奇怪? 2. 分析错误 …

线上频繁fullgc问题-SpringActuator的坑

整体复盘 一个不算普通的周五中午,同事收到了大量了cpu异常的报警。根据报警表现和通过arthas查看,很明显的问题就是内存不足,疯狂无效gc。而且结合arthas和gc日志查看,老年代打满了,gc不了一点。既然问题是内存问题&…

翱途O2OA新手上路-服务器下载及私有云部署

本篇主要简要描述从官网下载服务器,进行部署,启动的过程,并且描述在部署过程中常见的问题与报错以及云服务器安全策略配置和O2OA服务器端口修改的方式。 O2OA部署的服务器要求不高,一般使用4C8G以上的服务器均可正常运行。 一、检…

Spark_SparkSql写入Oracle_Undefined function.....将长字符串写入Oracle中方法..

在使用Spark编写代码将读库处理然后写入Oracle中遇到了诸多小bug,很磨人,好在解决了。shit!! 实测1:TO_CLOB(a3) 代码样例 --这是一个sparksql写入hive的一个小逻辑,我脱敏了噻 SELECT a1, a2, TO_CLOB(a3) AS clob_data, TO_DATE(a4) AS …

【C语言】每日一题,快速提升(4)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;实现计算机程序 解答&#xff1a; 该程序运用函数指针数组&#xff0c;具体请看代码 代码&#xff1a; #include <stdio.h> int add(int a…

C语言 | Leetcode C语言题解之第25题K个一组翻转链表

题目&#xff1a; 题解&#xff1a; /* 定义保存两个地址的结构体* 用来保存反转后结果的头节点和尾节点*/ typedef struct {struct ListNode* head; struct ListNode* tail; } TwoAddress; // 反转中间链表 TwoAddress* reverse(struct ListNode* head){struct ListNode* pr…

媒体邀约的好处?怎么邀请媒体?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约的好处主要体现在提高品牌知名度、扩大受众群体以及与媒体建立良好的合作关系。 媒体邀约是一种有效的公关策略&#xff0c;通过吸引媒体关注来促进信息的传播。它可以帮助组织…

MySQL 核心模块揭秘 | 14 期 | 回滚整个事务

回滚整个事务要怎么清除 binlog 日志&#xff0c;InnoDB 又会进行哪些操作&#xff1f; 作者&#xff1a;操盛春&#xff0c;爱可生技术专家&#xff0c;公众号『一树一溪』作者&#xff0c;专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品&#xff0c;原创内容未经授…

第七届机器学习与机器智能国际会议(MLMI 2024)即将召开!

第七届机器学习与机器智能国际会议&#xff08;MLMI 2024&#xff09;将于2024年8月2-4日在日本大阪举行。AI之巅&#xff0c;智慧之源&#xff0c;MLMI 2024将汇聚全球机器学习与机器智能领域的专家学者&#xff0c;分享最新的研究成果和实践经验&#xff0c;共同探讨如何将最…

安防视频监控/视频集中存储EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

常见面试算法题-九宫格按键输入法

■ 题目描述 九宫格按键输入&#xff0c;判断输出&#xff0c;有英文和数字两个模式&#xff0c;默认是数字模式&#xff0c;数字模式直接输出数字&#xff0c;英文模式连续按同一个按键会依次出现这个按键上的字母&#xff0c;如果输入”/”或者其他字符&#xff0c;则循环中…

基于Echarts的超市销售可视化分析系统(数据+程序+论文

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示&#xff0c;帮助决策层更好地了解销售情况和趋势&#xff0c;进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…

SpringBoot相关知识点总结

1 SpringBoot的目的 简化开发&#xff0c;开箱即用。 2 Spring Boot Starter Spring Boot Starter 是 Spring Boot 中的一个重要概念&#xff0c;它是一种提供依赖项的方式&#xff0c;可以帮助开发人员快速集成各种第三方库和框架。Spring Boot Starter 的目的是简化 Sprin…

椭圆曲线密码学(ECC)基本介绍和总结

背景 ECC英文全称"Elliptic Curve Cryptography"&#xff0c;其背后的密码学原理或者说安全性&#xff0c;是基于椭圆曲线离散对数问题&#xff08;Elliptic Curve Discrete Logarithm Problem&#xff0c;ECDLP&#xff09;。ECC密码学被普遍认为是RSA密码系统的接…

本地做好准备上传到Git分支,发现git上已经更新了,上传到dev分支

git add . git commit -m 备注 git pull --rebase origin dev 拉取dev上的代码合并到本地 git push -u origin dev推到远程dev上&#xff08;注意着可能不是最后一步&#xff0c;先看完&#xff09; 如果报错&#xff0c;意思是本地没有dev分支&#xff0c;没办法上传到git上…

Qt对象池,单例模式,对象池可以存储其他类的对象指针

代码描述&#xff1a; 写了一个类&#xff0c;命名为对象池&#xff08;ObjectPool &#xff09;&#xff0c;里面放个map容器。 3个功能&#xff1a;添加对象&#xff0c;删除对象&#xff0c;查找对象 该类只构建一次&#xff0c;故采用单例模式功能描述&#xff1a;对象池可…

树和二叉树(一)

一、树 非线性数据结构&#xff0c;在实际场景中&#xff0c;存在一对多&#xff0c;多对多的情况。 树( tree&#xff09;是n (n>0&#xff09;个节点的有限集。当n0时&#xff0c;称为空树。 在任意一个非空树中&#xff0c;有如下特点。 1.有且仅有一个特定的称为根的节点…

ELK日志分析系统之Kafka

目录 一、消息队列基本介绍 1、为什么需要消息队列(MQ) 2、使用消息队列的好处 1.解耦 2.可恢复性 3.缓冲 4.灵活性 & 峰值处理能力 5.异步通信 3、Kafka消息队列的两种模式 1.点对点模式 2.发布/订阅模式 二、Kafka基本介绍 1、Kafka定义 2、Kafka概念 3、…

SSRF靶场

SSRF概述 ​ 强制服务器发送一个攻击者的请求 ​ 互联网上的很多web应用提供了从其他服务器&#xff08;也可以是本地)获取数据的功能。使用用户指定的URL&#xff0c;web应用可以获取图片&#xff08;载入图片&#xff09;、文件资源&#xff08;下载或读取)。如下图所示&…