使用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)的表信息和字段信息,使用文本拼接寫入到文件里。
代碼分享
那本次設(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ù)名稱:{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 = ["字段", "類型", "允許空值", "鍵", "默認(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ù)名稱:{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 = '類型'
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
# 添加文檔類型選擇器
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") # 默認(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["文檔類型:"] = 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["文檔類型:"].get() == "Markdown": # 獲取文檔類型
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["文檔類型:"].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ù)名稱:", "")]
?
# 創(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ù)名稱:"]
?
# 生成文檔按鈕
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中統(tǒng)計(jì)計(jì)數(shù)的幾種方法和Counter詳解
今天小編就為大家分享一篇淺談python中統(tǒng)計(jì)計(jì)數(shù)的幾種方法和Counter詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
Python實(shí)現(xiàn)將Excel某范圍單元格內(nèi)容截圖
Openpyxl是一個(gè)強(qiáng)大的Python庫(kù),主要用于讀取、寫入和操作Excel文件,本文將使用Openpyxl實(shí)現(xiàn)將Excel某范圍單元格內(nèi)容截圖,感興趣的可以了解下2024-11-11
Python通過(guò)隊(duì)列來(lái)實(shí)現(xiàn)進(jìn)程間通信的示例
這篇文章主要介紹了Python通過(guò)隊(duì)列來(lái)實(shí)現(xiàn)進(jìn)程間通信的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2020-10-10
python實(shí)現(xiàn)批量下載新浪博客的方法
這篇文章主要介紹了python實(shí)現(xiàn)批量下載新浪博客的方法,涉及Python頁(yè)面抓取的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-06-06
Python庫(kù)Gym開發(fā)和比較強(qiáng)化學(xué)習(xí)算法使用探究
這篇文章主要介紹了Python庫(kù)Gym開發(fā)和比較強(qiáng)化學(xué)習(xí)算法使用探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲?qū)嵗a
這篇文章主要給大家介紹了關(guān)于python實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
Python三元運(yùn)算與lambda表達(dá)式實(shí)例解析
這篇文章主要介紹了Python三元運(yùn)算與lambda表達(dá)式實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11

