当前位置: 首页 > news >正文

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

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一起,每天不一样!

相关文章:

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

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 逛博客的时候,发现了一个很有意思的文章:数据库表结构导…...

在群晖上安装GPT4Free

什么是 GPT4Free ? GPT4Free 简称 G4F,是一个强大的大型语言模型命令行界面(LLM-CLI),旨在去中心化并提供免费访问先进人工智能技术的能力。G4F 的目标是通过提供用户友好和高效的工具,使人工智能民主化&am…...

C# 语言类型(四)—传递参数及其修饰符

总目录 C# 语法总目录 参考链接: C#语法系列:C# 语言类型(一)—预定义类型值之数值类型 C#语法系列:C# 语言类型(二)—预定义类型之字符串及字符类型简述 C#语法系列:C# 语言类型(三)—数组/枚举类型/结构体 C#语法系列:C# 语言类型(四)—传递参数及其修饰符 C#语法…...

刷穿力扣006-剑指offer一数组——02寻找目标值-二维数组

刷穿力扣006-剑指offer<一>数组——02寻找目标值-二维数组 基本面试题都是我带大家刷的力扣热题100和剑指offer的75道题&#xff0c;建议刷两遍&#xff01;&#xff08;ps:想找工作实习的同学&#xff0c;文末有面试八股和简历模板&#xff09; 题目&#xff1a; 语言…...

爬虫(小案例)

点开其中一个链接&#xff0c; http://desk.zol.com.cn/dongman/huoyingrenzhe/&#xff08;前面为浏览器自动补全&#xff0c;在代码里需要自己补全&#xff09; 可以看到图片的下载地址以及打开本图集下一张图片的链接 了解完网站的图片构造后动手写代码&#xff0c;我们筛…...

环信 IM 客户端将适配鸿蒙 HarmonyOS

自华为推出了自主研发操作系统鸿蒙 HarmonyOS 后&#xff0c;国内许多应用软件开始陆续全面兼容和接入鸿蒙操作系统。环信 IM 客户端计划将全面适配统鸿蒙 HarmonyOS &#xff0c;助力开发者快速实现社交娱乐、语聊房、在线教育、智能硬件、社交电商、在线金融、线上医疗等广泛…...

伪元素的使用

.box::after{content: ;display: block;// 定义元素位置margin-top: 12rpx;margin-right: 20rpx;// 定义元素宽高width: 36rpx;height: 36rpx;// background-image无法引用本地资源&#xff0c;故需要用网络地址background-image: url($urlcalendar.png);background-size: 100%…...

TensorFlow学习之:高级应用和扩展

生成对抗网络&#xff1a;了解GAN的基本原理&#xff0c;使用TensorFlow实现简单的GAN 生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;GAN&#xff09;由两部分组成&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discrimin…...

maya模板导入动画

maya模板导入动画&#xff0c;第一帧为模板姿态 要将一个FBX文件中的动画数据导入另一个FBX文件的模板&#xff0c;并使得第一帧是模板的初始姿势&#xff0c;第二帧开始是动画&#xff0c;你可以在Maya中采用以下步骤来操作&#xff1a; 步骤 1: 导入模板FBX 首先&#xff…...

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目&#xff0c;…...

STM32-ADC(独立模式、双重模式)

ADC简介 18个通道&#xff1a;外部信号源就是16个GPIO回。在引脚上直接接模拟信号就行了&#xff0c;不需要侄何额外的电路。引脚就直接能测电压。2个内部信号源是内部温度传感器和内部参考电压。 逐次逼近型ADC: 它是一个独立的8位逐次逼近型ADC芯片&#xff0c;这个ADC0809是…...

03.卸载MySQL

卸载MySQL 1.Windows卸载MySQL8 停止服务 用命令停止或者在服务中停止都可以 net stop mysql&#xff08;服务名字可以去服务里面看一下&#xff09;控制面板卸载MySQL 卸载MySQL8.0的程序可以和其他桌面应用程序一样直接在控制面板选择卸载程序&#xff0c;并在程序列表中…...

2024.4.13 蓝桥杯软件类C++B组山东省赛 小记

大三老狗了 &#xff0c; 还是把精力放在考研上了 &#xff0c;所以只是蓝桥杯的前一晚上把常用算法翻了翻。 其实还做了一场小模拟&#xff0c;两个题分值200分我狂砍了17分&#xff0c;bfs写半小时写不明白&#xff0c;所以晚上已经是心如死灰了&#xff0c;所以就早早睡觉了…...

Windows下IntelliJ IDEA远程连接服务器中Hadoop运行WordCount(详细版)

使用IDEA直接运行Hadoop项目&#xff0c;有两种方式&#xff0c;分别是本地式&#xff1a;本地安装HadoopIDEA&#xff1b;远程式&#xff1a;远程部署Hadoop&#xff0c;本地安装IDEA并连接&#xff0c; 本文介绍第二种。 一、安装配置Hadoop (1)虚拟机伪分布式 见上才艺&a…...

【每日刷题】Day16

【每日刷题】Day16 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 2. 160. 相交链表 - 力扣&…...

【K8s】:在 Kubernetes 集群中部署 MySQL8.0 高可用集群(1主2从)

【K8s】&#xff1a;在 Kubernetes 集群中部署 MySQL8.0 高可用集群&#xff08;1主2从&#xff09; 一、准备工作二、搭建nfs服务器2.1 安装 NFS 服务器软件包&#xff08;所有节点执行&#xff09;2.2 设置共享目录2.3 启动 NFS 服务器2.4 设置防火墙规则&#xff08;可选&am…...

Vue内置组件TransitionGroup详细介绍

<TransitionGroup> 是一个内置组件&#xff0c;用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。 和 <Transition> 的区别​ <TransitionGroup> 支持和 <Transition> 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器…...

【机器学习300问】71、神经网络中前向传播和反向传播是什么?

我之前写了一篇有关计算图如何帮助人们理解反向传播的文章&#xff0c;那为什么我还要写这篇文章呢&#xff1f;是因为我又学习了一个新的方法来可视化前向传播和反向传播&#xff0c;我想把两种方法总结在一起&#xff0c;方便我自己后续的复习。对了顺便附上往期文章的链接方…...

【ZZULIOJ】1067: 有问题的里程表(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 某辆汽车有一个里程表&#xff0c;该里程表可以显示一个整数&#xff0c;为该车走过的公里数。然而这个里程表有个毛病&#xff1a;它总是从3变到5&#xff0c;而跳过数字4&#xff0c;里程表…...

A21 STM32_HAL库函数 之 I2c通用驱动程序 -- B -- 所有函数的介绍及使用

A21 STM32_HAL库函数 之 I2c通用驱动程序 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.12 HAL_I2C_Master_Sequential_Receive_IT1.13 HAL_I2C_Slave_Transmit_IT1.14 HAL_I2C_Slave_Receive_IT1.15 HAL_I2C_Slave_Sequential_Transmit_IT1.16 HAL_I2C_Slave_Sequential_R…...

简介:Asp.Net Core进阶高级编程教程

课程简介目录 &#x1f680;前言一、课程背景二、课程目的三、课程特点四、课程适合人员六、最后 &#x1f680;前言 本文是《.Net Core进阶编程课程》教程专栏的导航站&#xff08;点击链接&#xff0c;跳转到专栏主页&#xff0c;欢迎订阅&#xff0c;持续更新…&#xff09…...

Linux系统中LVM与磁盘配额

目录 一、LVM逻辑卷管理 二、LVM的管理命令 物理卷管理 卷组管理 逻辑卷管理 *创建并使用LVM步骤 三、磁盘配额概述 实现磁盘限额的条件 Linux 磁盘限额的特点 四、磁盘配额管理 磁盘限额 一、LVM逻辑卷管理 能够在保持现有数据不变的情况下动态调整磁盘容量&#…...

手机重启手app没了

发现公司有些Android球机设备&#xff0c;安装了一些app&#xff0c;重启后app没了&#xff0c;还有公司的一些Android手机&#xff0c;原来是没问题的&#xff0c;不知道哪天起&#xff0c;只要重启&#xff0c;新安装的软件就会没了&#xff0c;很神奇。后来发现&#xff0c;…...

github上传代码

偷一下懒&#xff0c;把链接贴一下&#xff0c;后续再补充。 1.下载Git 【学习笔记】上传代码到GitHub&#xff08;保姆级教程&#xff09; 2.如何创建GitHub仓库 手把手教你在github上传文件 3.如何删掉GitHub仓库 github如何删除仓库或项目&#xff1f; 4.遇到的错误 …...

Qt+vstudio2022的报错信息积累

从今天开始记录一下平常开发工作中的报错记录&#xff0c;后续有错误动态补充&#xff01; 报错信息&#xff1a;【MSB8041】此项目需要 MFC 库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体系结构安装它们。 解决&#xff1a; 背景&#xff1a;换…...

力扣练习题(2024/4/16)

1买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…...

c++中一些常用库函数

1.最大公约数 需要包括头文件#include<algorithm>,直接写__gcd(a,b),就是求a与b的最大公约数。 #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<map>…...

竞赛 基于GRU的 电影评论情感分析 - python 深度学习 情感分类

文章目录 1 前言1.1 项目介绍 2 情感分类介绍3 数据集4 实现4.1 数据预处理4.2 构建网络4.3 训练模型4.4 模型评估4.5 模型预测 5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于GRU的 电影评论情感分析 该项目较为新颖&#xff0c;适合作为竞…...

软件杯 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…...

java日志log4j使用

1、导入jar包 log4j-1.2.17.jar log4j-api-2.0-rc1.jar log4j-core-2.0-rc1.jar https://download.csdn.net/download/weixin_44201223/89148839 所需jar包下载地址 2、创建 log4j.properties src 下创建 log4j.properties (路径和名称都不允许改变)&#xff0c;放置 src 下…...

网站建设有限公司/色盲测试图

首先要来了解的一个概念就是聚类&#xff0c;简单地说就是把相似的东西分到一组&#xff0c;同 Classification (分类)不同&#xff0c;对于一个 classifier &#xff0c;通常需要你告诉它“这个东西被分为某某类”这样一些例子&#xff0c;理想情况下&#xff0c;一个 classif…...

wordpress uctheme/百度极速版客服人工在线咨询

我需要一些帮助来替换和添加自己的Header到DualCore风格。我试图联系风格的作者&#xff0c;但看起来他并不可用。HTML/CSS&#xff1a;如何在phpBB风格中添加自定义横幅正如你可以看到在登录链接下右上方有一个小标题&#xff0c;但我在替换它和添加自己的标题时遇到了一些困难…...

高端网站模板/网络广告有哪些

文章目录一、介绍二、知识点1. Lua脚本1.1 介绍1.2 使用2. Splash API2.1 介绍2.2 使用1.render.html2.render.png3.execute一、介绍 1.提供JavaScript渲染服务 2.带有HTTP API的轻量级浏览器 3.对接了Python中的Twisted和QT库 Splash文档&#xff1a;传送门 二、知识点 1.…...

滨海新区城市建设档案馆网站/指数基金

约束用于确保数据库数据的完整性,在oracle 数据库中,可以使用约束,触发器和应用代码(过程,函数)3种方法实现数据完整性,这3种方法中,因为约束易于维护,并且具有最好的性能,所以实现数据完整性首选约束. 一.约束分类1.Not null&#xff1a; 确保字段值不能为空。2.Unique: 确保…...

网站排名代做/网络推广费用计入什么科目

学习目标 了解什么是特征提取知道字典特征提取操作流程知道文本特征提取操作流程知道tfidf的实现思想什么是特征提取呢&#xff1f; 1 特征提取 1.1 定义 将任意数据&#xff08;如文本或图像&#xff09;转换为可用于机器学习的数字特征 注&#xff1a;特征值化是为了计算机…...

做网站的猫腻/网络推广一般都干啥

本文实例为大家分享了Android仿京东首页秒杀倒计时的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下xml配置android:layout_width"wrap_content"android:layout_height"wrap_content"android:background"#FFFFFF"android:orientation&…...