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 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()
效果
最后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