使用Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)文檔生成工具
逛博客的時(shí)候,發(fā)現(xiàn)了一個(gè)很有意思的文章:數(shù)據(jù)庫(kù)表結(jié)構(gòu)導(dǎo)出工具。帶著好奇,我也去DIY了一個(gè),先看看效果:
這個(gè)就是主要的程序界面,可以選擇生成md文檔或者docx文檔。具體的文檔內(nèi)容如下:
md文檔
docx文檔
功能可以成功的實(shí)現(xiàn),現(xiàn)在我們來(lái)分析一下原理,核心就是幾條sql語(yǔ)句:
use security; ? show tables; ? desc dict; show full columns from dict where field = 'is_del';
原理分析
查看全部的表
使用show tables
就可以看到當(dāng)前數(shù)據(jù)庫(kù)下邊的所有的數(shù)據(jù)表。
查看表結(jié)構(gòu)
使用desc xxx
即可查看表的詳細(xì)結(jié)構(gòu),包含字段的全部信息。
查看字段注釋
字段的注釋需要額外的sql了:
當(dāng)然,shigen
也看到過(guò)連表查詢出字段的注釋的,可以進(jìn)一步的改進(jìn)。
總結(jié)
做一波小總結(jié):其實(shí)數(shù)據(jù)庫(kù)文檔生成,就是用一些sql語(yǔ)句獲得對(duì)應(yīng)的表信息和字段信息,使用文本拼接寫(xiě)入到文件里。
代碼分享
那本次設(shè)計(jì)的代碼也在這里,歡迎大家學(xué)習(xí)交流:
from tkinter import * from tkinter import messagebox ? import mysql.connector from docx import Document from tabulate import tabulate ? ? # 連接到MySQL數(shù)據(jù)庫(kù) 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("錯(cuò)誤", f"連接到MySQL數(shù)據(jù)庫(kù)時(shí)出錯(cuò):{err}") return None ? ? # 獲取數(shù)據(jù)庫(kù)中的表信息及字段注釋 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個(gè)元素中 cursor.close() return comment ? ? # 生成Markdown格式的數(shù)據(jù)庫(kù)文檔 def generate_markdown_documentation(tables_info): documentation = "# 數(shù)據(jù)庫(kù)文檔\n\n" documentation += f"數(shù)據(jù)庫(kù)地址:{host_entry.get()}\n" documentation += f"用戶名:{user_entry.get()}\n" documentation += f"數(shù)據(jù)庫(kù)名稱(chēng):{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 = ["字段", "類(lèi)型", "允許空值", "鍵", "默認(rèn)值", "額外信息", "注釋"] # 添加注釋列 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格式的數(shù)據(jù)庫(kù)文檔 def generate_docx_documentation(tables_info): doc = Document() doc.add_heading('數(shù)據(jù)庫(kù)文檔', 0) doc.add_paragraph(f"數(shù)據(jù)庫(kù)地址:{host_entry.get()}") doc.add_paragraph(f"用戶名:{user_entry.get()}") doc.add_paragraph(f"數(shù)據(jù)庫(kù)名稱(chēng):{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) ? # 創(chuàng)建帶邊框的表格 table = doc.add_table(rows=1, cols=7) table.style = 'Table Grid' # 設(shè)置表格樣式為帶邊框的樣式 table.autofit = False # 禁止自動(dòng)調(diào)整列寬 ? hdr_cells = table.rows[0].cells hdr_cells[0].text = '字段' hdr_cells[1].text = '類(lèi)型' hdr_cells[2].text = '允許空值' hdr_cells[3].text = '鍵' hdr_cells[4].text = '默認(rèn)值' 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 ? ? # 創(chuàng)建標(biāo)簽和輸入框 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 # 添加文檔類(lèi)型選擇器 label = Label(root, text="文檔類(lèi)型:") label.grid(row=len(fields), column=0, padx=10, pady=10, sticky="w") doc_type = StringVar(root) doc_type.set("Markdown") # 默認(rèn)選擇 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["文檔類(lèi)型:"] = doc_type return entries ? ? # 生成文檔 def generate_document(): global conn # 在函數(shù)內(nèi)部使用全局變量 conn conn = connect_to_database() if conn: tables_info = get_table_info(conn) if entries["文檔類(lèi)型:"].get() == "Markdown": # 獲取文檔類(lèi)型 documentation = generate_markdown_documentation(tables_info) with open("數(shù)據(jù)庫(kù)文檔.md", "w", encoding="utf-8") as file: file.write(documentation) messagebox.showinfo("成功", "Markdown文檔生成成功!") elif entries["文檔類(lèi)型:"].get() == "Docx": doc = generate_docx_documentation(tables_info) doc.save("數(shù)據(jù)庫(kù)文檔.docx") messagebox.showinfo("成功", "Docx文檔生成成功!") ? ? # 創(chuàng)建主窗口 root = Tk() root.title("數(shù)據(jù)庫(kù)文檔生成器") root.geometry("400x300") ? # 標(biāo)簽和輸入框的內(nèi)容 fields = [("主機(jī)地址:", ""), ("用戶名:", ""), ("密碼:", ""), ("數(shù)據(jù)庫(kù)名稱(chēng):", "")] ? # 創(chuàng)建標(biāo)簽和輸入框 entries = create_input_fields(root, fields) ? # 獲取輸入框的內(nèi)容 host_entry = entries["主機(jī)地址:"] user_entry = entries["用戶名:"] password_entry = entries["密碼:"] database_entry = entries["數(shù)據(jù)庫(kù)名稱(chēng):"] ? # 生成文檔按鈕 generate_button = Button(root, text="生成文檔", command=generate_document) generate_button.grid(row=len(fields) + 1, columnspan=2, padx=10, pady=10) ? root.mainloop()
以上就是使用Python實(shí)現(xiàn)數(shù)據(jù)庫(kù)文檔生成工具的詳細(xì)內(nèi)容,更多關(guān)于Python生成數(shù)據(jù)庫(kù)文檔的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python讀取word文檔,插入mysql數(shù)據(jù)庫(kù)的示例代碼
- python將txt文檔每行內(nèi)容循環(huán)插入數(shù)據(jù)庫(kù)的方法
- Python數(shù)據(jù)庫(kù)格式化輸出文檔的思路與方法
- 用python生成mysql數(shù)據(jù)庫(kù)結(jié)構(gòu)文檔
- Python實(shí)現(xiàn)動(dòng)態(tài)生成系統(tǒng)數(shù)據(jù)庫(kù)設(shè)計(jì)到Word文檔
- python TinyDB輕量級(jí)文檔導(dǎo)向數(shù)據(jù)庫(kù)輕松存儲(chǔ)訪問(wèn)
相關(guān)文章
python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解
在本篇文章里小編給大家整理的是一篇關(guān)于python實(shí)現(xiàn)梯度下降算法的實(shí)例詳解內(nèi)容,需要的朋友們可以參考下。2020-08-08python庫(kù)pycryptodom加密技術(shù)探索(公鑰加密私鑰加密)
這篇文章主要為大家介紹了python庫(kù)pycryptodom加密技術(shù)探索(公鑰加密私鑰加密),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python random模塊制作簡(jiǎn)易的四位數(shù)驗(yàn)證碼
這篇文章主要介紹了Python random模塊制作簡(jiǎn)易的四位數(shù)驗(yàn)證碼,文中給大家提到了python中random模塊的相關(guān)知識(shí),需要的朋友可以參考下2020-02-02一百行python代碼將圖片轉(zhuǎn)成字符畫(huà)
這篇文章主要為大家詳細(xì)介紹了一百行python代碼將圖片轉(zhuǎn)成字符畫(huà) ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11Pycharm debug調(diào)試時(shí)帶參數(shù)過(guò)程解析
這篇文章主要介紹了Pycharm debug調(diào)試時(shí)帶參數(shù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02Python urllib庫(kù)如何添加headers過(guò)程解析
這篇文章主要介紹了Python urllib庫(kù)如何添加headers過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10python數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)換實(shí)例詳解
這篇文章主要介紹了python數(shù)據(jù)類(lèi)型強(qiáng)制轉(zhuǎn)換實(shí)例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Python更新數(shù)據(jù)庫(kù)腳本兩種方法及對(duì)比介紹
這篇文章給大家介紹了Python更新數(shù)據(jù)庫(kù)腳本兩種方法及數(shù)據(jù)庫(kù)查詢?nèi)N方式,然后在文章下面給大家介紹了兩種方式對(duì)比介紹,非常不錯(cuò),感興趣的朋友參考下吧2017-07-07