• 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 
        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

  • 相关阅读:
    java8特性Stream流和lambda表达式在实际开发中应用
    数据库学习
    数字人直播系统开发哪家好?
    轻松学习jQuery事件和动画
    Docker复习06——Dockerfile+Docker微服务实战
    服务器免密码快捷登录
    经过几年和前端调接口,我把抓包调试摸透了,浏览器岂非我对手
    mysql主从,高可用复制原理(I)
    【算法】万圣节前夕的迷宫挑战(二)
    《Python等级考试(1~6级)历届真题解析》专栏总目录
  • 原文地址:https://blog.csdn.net/qq_53325717/article/details/139426196