MacOS13-将数据库转为markdown,docx格式

MacOS13-将数据库转为markdown,docx格式

文章目录

  • 先说踩坑点
    • 各种模块缺失
  • 代码
  • 效果
  • 总结
  • 参考

先说踩坑点

各种模块缺失

tkinter

mysql

没错,你可以直接点击安装;

请添加图片描述

如果还出现报错
请添加图片描述

你需要打开终端

pip install mysqlclient

再次点进去安装后会出现导包,选择第二个

同样在这个页面,搜索安装各种模块

docx

报错

“Traceback (most recent call last):
  File "/Users/lin/Desktop/Python/mysql/tomd.py", line 4, in <module>
    from docx import Document”

请添加图片描述

但是这里又出现了一个问题

由于我是使用anaconda的python环境

需要更换为本地的安装的python3.11
请添加图片描述

我还是使用之前项目的3.11(同一个版本),换了之后同样出现tk无法查找模块的话

先查找本机python匹配的版本

brew search python-tk
==> Formulae
python-tk@3.10     python-tk@3.9       python@3.7          python@3.9 
python-tk@3.11      python-yq           python@3.8

最后安装

brew install python-tk@3.11

最后安装tkinterMessagebox,安装好后如下图

请添加图片描述

代码

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()

效果

请添加图片描述

请添加图片描述

最后markdown格式会生成在py文件的同级目录下

请添加图片描述

请添加图片描述

总结

还是需要一步一步来,打好基础,比如我现在虽然写完文档了,程序可以跑了,但是依旧不是很懂基本的python设置,所以基础真的很重要,后面找个时间好好看看基础部分

参考

https://blog.csdn.net/tekin_cn/article/details/135271779

https://zhuanlan.zhihu.com/p/692851609

https://juejin.cn/post/7346580626318983180

https://blog.csdn.net/qq_44874645/article/details/109311212

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言| 输出菱形*(梳理篇II)

C语言| 输出菱形*-CSDN博客 凡事还是得自己独立思考后&#xff0c;写一遍程序才能发现问题所在。 容易犯的错误&#xff1a; 【完整程序注释】 运行结果 /* 输出菱形 1 总行数 n为奇数&#xff0c;分上三角形下三角形&#xff0c;只考虑左边的空格和星号* 2 上三角形 行数…

toefl listening_托福听力

x.1 课程介绍 x.1.1 课程介绍 考试介绍 注意事项如下&#xff0c; x.1.2 分数设定和方法论 x.2.1 细节题解法 x.2.2 对话主旨题解法 听力对话不要扣分&#xff1b; 内容主旨题&#xff0c;以what开头&#xff1b; 目的主旨题&#xff0c;以why开头&#xff1b; 目的主旨题…

【论文笔记】Content-based Unrestricted Adversarial Attack

图2&#xff1a;Adversarial Content Attack的流程。首先使用Image Latent Mapping将图像映射到潜变量空间。然后&#xff0c;用Adversarial Latent Optimization生成对抗性样本。最后&#xff0c;生成的对抗性样本可以欺骗到目标分类模型。 3.1 Image Latent Mapping 对于扩…

代码随想录算法训练营第四十一天 | 理论基础、509.斐波那契数列、70.爬楼梯、746.使用最小花费爬楼梯

目录 理论基础 509.斐波那契数列 思路 代码 70.爬楼梯 思路 代码 746.使用最小花费爬楼梯 思路 代码 理论基础 代码随想录 视频&#xff1a;从此再也不怕动态规划了&#xff0c;动态规划解题方法论大曝光 &#xff01;| 理论基础 |力扣刷题总结| 动态规划入门_哔哩哔…

uni微信小程序editor富文本组件如何插入图片

需求 在editor中插入图片&#xff0c;并对图片进行编辑&#xff0c;简略看一下组件的属性&#xff0c;官网editor 组件 | uni-app官网 解决方案 首先要使用到ready这个属性&#xff0c;然后官网有给代码粘过来&#xff0c;简单解释一下这段代码的意思&#xff08;作用是在不同…

带大家做一个,易上手的家常猪肉炖白菜

今天 带大家做一个 猪肉炖白菜 一块猪肉 切片 一块生姜 两边

20240603在飞凌的OK3588-C开发板上跑原厂IPC方案时确认OV5645

v4l2-ctl --list-devices media-ctl -p -d /dev/media2 20240603在飞凌的OK3588-C开发板上跑原厂IPC方案时确认OV5645 2024/6/3 16:39 确认OV5645已经正常挂载了&#xff1a; Microsoft Windows [版本 10.0.22621.3296] (c) Microsoft Corporation。保留所有权利。 C:\Users\Q…

音频pop音的数学与物理解释

音频数据跳变太大的时候通常会有pop音&#xff0c;此时频谱上看pop音位置能量较高 音频中的“pop”音通常是由于信号的不连续性或瞬态变化造成的。这种不连续性的数学和物理原因可以从以下几个方面解释&#xff1a; 数学解释 信号不连续性 当音频信号发生突变时&#xff0c;…

从 0 到 1 带你认识 Git 在个人和企业开发中的原理及应用

文章目录 学习目标Git 初识提出问题如何解决&#xff1f;—— 版本控制器注意事项 Git 安装Linux CentOSLinux UbuntuWindows Git 基本操作创建 Git 本地仓库配置 Git 认识工作区、暂存区、版本库添加文件——场景一查看 .git 文件 添加文件——场景二 修改文件版本回退 学习目…

一文读懂GDPR

GDPR将对人们的网络足迹、使用的APP和服务如何保护或利用这些数据产生重大影响。 下面我们将对有关GDPR人们最关心的问题进行解读。 GDPR是什么&#xff1f; 一般数据保护条例&#xff08;General Data Protection Regulation&#xff09;是一项全面的法律&#xff0c;赋予了…

SaaS增长| 联盟营销经理必须要知道的十个关键指标!

你对你的联盟合作伙伴计划了解多少&#xff1f;这个问题的答案将取决于你的数据有多好&#xff0c;以及你跟踪数据的效率如何。 如果你还在整合各种资源&#xff0c;不必担心。合作伙伴计划需要时间和努力来建立&#xff0c;而且很难立即实施适当的报告制度&#xff0c;尤其是…

Python私教张大鹏万字长文讲解Tailwindcss Flex 和 Grid 布局相关的样式,附完整源码和效果截图

flex-basics 样式类 Utilities for controlling the initial size of flex items. 用于控制伸缩项的初始大小的实用程序。 基础样式 ClassPropertiesbasis-0flex-basis: 0px;basis-1flex-basis: 0.25rem; /* 4px */basis-2flex-basis: 0.5rem; /* 8px */basis-3flex-basis:…

程序员的五大职业素养,你知道吗?

程序员职业生涯的挑战与机遇 在当今这个科技日新月异的时代&#xff0c;程序员作为技术行业的中坚力量&#xff0c;其职业生涯无疑充满了无数挑战与机遇。技术的快速迭代要求他们必须不断学习新知识、掌握新技能&#xff0c;以跟上时代的步伐。同时&#xff0c;云计算、人工智…

python常见数据分析函数

apply DataFrame.apply(func, axis0, broadcastFalse, rawFalse, reduceNone, args(), **kwds) 第一个参数是函数 可以在Series或DataFrame上执行一个函数 支持对行、列或单个值进行处理 import numpy as np import pandas as pdf lambda x: x.max()-x.min()df pd.DataFrame(…

Spring Cloud学习笔记(Nacos):Nacos持久化(未完成)

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、Overview2、单机使用MySQL 1、Overview 我们关闭单机下的Nacos后&#xff0c;再重新启动会发现之前配置的内容没有被删除。这时因为Nacos有内嵌的数据库derby&#xff0c;会自己持久化。 但是在集群的情况下…

【用户画像】用户偏好购物模型BP

一、前言 用户购物偏好模型BP&#xff08;Buyer Preferences Model&#xff09;旨在通过对用户购物行为的深入分析和建模&#xff0c;以量化用户对不同商品或服务的偏好程度。该模型对于电商平台、零售商以及其他涉及消费者决策的商业实体来说&#xff0c;具有重要的应用价值。…

尝试编译 AMD ROCm 的 llvm-project

0&#xff0c;环境 ubuntu 22.04 gcc-11 x86_64 18cores/36threads 256GB RAM rocm 6.0.2 Radeon VII 1&#xff0c;第一次尝试 构建命令&#xff1a; cmake -G "Unix Makefiles" ../llvm \ -DLLVM_ENABLE_PROJECTS"clang;lld;lldb;mlir;openmp" \…

TCP报头

TCP报头 一:TCP报头1.1: 16位源端口号 && 16位目的端口号1.2: 选项1.3: 4位首部长度1.4: 保留位1.5 :标志位1.6: 16位窗口大小1.7: 16位紧急指针1.8: 32位序号 && 32位确认序号1.9: 16位校验和二级目录 一级目录二级目录二级目录二级目录 一级目录一级目录一级…

[GeoServer系列]Shapefile数据发布

【GeoServer系列】——安装与发布shapefile数据-CSDN博客 将待发布数据放置指定目录下 webapps\geoserver\data\data 创建存储仓库 新建矢量数据源 发布图层 设置边框 设置样式 使用 方式1 let highRoad new Cesium.WebMapServiceImageryProvider({url: http://local…

一维时间序列信号的奇异小波时频分析方法(Python)

最初的时频分析技术就是短时窗傅里叶变换STFT&#xff0c;由于时窗变短&#xff0c;可供分析的信号量减少&#xff0c;采用经典的谱估算方法引起的误差所占比重会增加。且该短时窗一旦选定&#xff0e;则在整个变换过程中其时窗长度是固定的。变换后的时频分辨率也即固定&#…