闲不住,手写了数据库生成工具

简介: `shigen`是一个擅长多种编程语言的博主,分享技术成长和认知。最近,他制作了一个数据库表结构导出工具,支持生成MD和DOCX文档。程序通过SQL(如`show tables`和`desc`)获取信息,展示包括字段注释在内的表详情。代码已分享,可用于学习交流。一起学习,每天进步!

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 messagebox

import 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 conn
    except 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].cells
        hdr_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().cells
            row_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")  # 默认选择 Markdown
    doc_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_type
    return entries


# 生成文档
def generate_document():
    global conn  # 在函数内部使用全局变量 conn
    conn = 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一起,每天不一样!

目录
相关文章
|
5月前
|
数据可视化 BI API
无缝对接云数据库:自定义报表生成工具在混合云环境下的部署指南
自定义报表生成工具通过拖拽设计、多数据源整合及自动化输出,帮助业务人员零代码创建个性化报表,解决传统工具灵活性不足、技术门槛高的问题。文章对比其与传统报表差异,列举行业应用场景(如财务、零售),并给出选型建议与主流工具(如FineReport、Power BI、板栗看板)的优劣势分析。
237 0
|
3月前
|
人工智能 数据库 iOS开发
DBeaver Ultimate Edtion 25.2 发布 - 通用数据库工具
DBeaver Ultimate Edtion 25.2 Multilingual (macOS, Linux, Windows) - 通用数据库工具
488 0
|
5月前
|
SQL 存储 数据库
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 21 - 微软数据库管理工具
1021 0
|
9月前
|
自然语言处理 数据库 iOS开发
DBeaver Ultimate Edtion 25.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具
DBeaver Ultimate Edtion 25.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具
653 12
DBeaver Ultimate Edtion 25.0 Multilingual (macOS, Linux, Windows) - 通用数据库工具
|
11月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决
460 69
|
9月前
|
SQL 分布式计算 数据库
【YashanDB 知识库】Hive 命令工具 insert 崖山数据库报错
【YashanDB 知识库】Hive 命令工具 insert 崖山数据库报错
|
9月前
|
SQL 关系型数据库 网络安全
Navicat Premium 17 最新版下载与配置:5分钟完成企业级数据库工具部署
Navicat Premium 17 是一款支持多种主流数据库(如 MySQL、Oracle、PostgreSQL 等)的多数据库管理工具,提供可视化数据建模、SQL 编辑和数据同步等功能。试用版提供 14 天全功能体验,商业版支持跨平台使用。安装环境要求 Windows 10/11 或 macOS 12.0+,最低配置为 4GB 内存。下载并解压安装包后,按步骤启动安装程序、接受许可协议、自定义安装路径并完成安装。首次运行时需激活许可证并配置数据库连接。常见问题包括无法写入注册表、试用期续费及连接数据库权限问题。高级功能涵盖 SSH 通道加速、自动化任务调度和性能调优建议。
2580 19
|
10月前
|
关系型数据库 数据库连接 数据库
循序渐进丨MogDB 中 gs_dump 数据库导出工具源码概览
通过这种循序渐进的方式,您可以深入理解 `gs_dump` 的实现,并根据需要进行定制和优化。这不仅有助于提升数据库管理的效率,还能为数据迁移和备份提供可靠的保障。
307 6
|
8月前
|
SQL Oracle 数据库
这款免费数据库工具,可能是YashanDB图形化管理的最佳选择
DBeaver for YashanDB 是一款专为国产自研数据库 YashanDB 定制的图形化管理工具,基于全球流行的开源数据库工具 DBeaver 二次开发而成。它深度适配 YashanDB 的各种架构,支持 HEAP/LSC 多形态表管理和 Oracle 生态兼容,提供高效的对象管理、智能 SQL 开发和工业级 PL/SQL 调试功能。通过可视化操作,开发者可轻松完成物化视图配置、存储过程管理等复杂任务,大幅提升效率。该工具完全免费,支持多平台,为企业级数据库管理提供了成熟解决方案。
|
9月前
|
SQL 分布式计算 数据库
【YashanDB知识库】Hive 命令工具insert崖山数据库报错
【YashanDB知识库】Hive 命令工具insert崖山数据库报错

热门文章

最新文章