歡迎您光臨本站 註冊首頁

Python3自動生成MySQL數據字典的markdown文本的實現

←手機掃碼閱讀     niceskyabc @ 2020-05-08 , reply:0

為啥要寫這個腳本
五一前的準備下班的時候,看到同事為了做數據庫的某個表的數據字典,在做一個複雜的人工操作,就是一個字段一個字段的純手擼,那速度可想而知是多麼的折磨和鍛鍊人的意志和耐心,反正就是很耗時又費力的活,關鍵是工作效率太低了,於是就網上查了一下,能否有在線工具可用,但是並沒有找到理想和如意的,於是吧,就乾脆自己擼一個,一勞永逸,說幹就幹的那種……
先屢一下腳本思路
第一步:輸入或修改數據庫連接配置信息,以及輸入數據表名
第二步:利用pymysql模塊連接數據庫,並判斷數據表是否存在
第三步:獲取數據表的註釋
第四步:存儲文件夾和文件處理,刪除已存在的文件避免重複寫入
第五步:先寫入Markdown的表頭部信息
第六步:從information_schema中查詢表結構和相關信息
第七步:依次拼裝每個字段的Markdown文本寫入,結束並關閉相關連接
運行環境
Python運行環境:Windows + python3.6
用到的模塊:pymysql、os、time、pyinstaller
如未安裝的模塊,請使用pip instatll xxxxxx進行安裝,例如:pip install pyinstaller
獲取數據庫連接信息的兩種方式
然是要做數據字典,那麼肯定就需要先連接數據庫,而連接數據庫,自然就需要先知道數據庫的基本信息:IP地址、用戶名、登錄密碼、數據庫名等……
為了方便,我這裡寫了兩種配置MySQL連接的方法:第一種是直接配置在代碼裡,直接修改代碼裡的連接信息就可以了;另外一種就是通過手動輸入鏈接信息,不用修改代碼,方便快速多用。具體的完整源碼,我都上傳到同性交友網站GitHub了,可以點下面的鏈接查看……
生成可執行文件
為了方便不同的人群方便快速的使用,可以不用安裝Python環境來執行py腳本文件,我把相關腳本打包成Windows可直接執行的exe文件,下載雙擊運行即可(可能有的系統需要管理員權限運行),打包的方式很簡單,就是利用 pyinstaller 模塊進行快速打包,省時省力,具體更多用法大家可以網上查一下。
打包命令為: pyinstaller -F -i favicon.ico data_dict_input.py
執行這個命令後,就會在當前目錄下生成一個dict和其他的文件夾和相關文件,其中,打開dict,下面會生成一個文件名相同的exe文件 data_dict_input.exe ,雙擊這個文件就可以打開了,拷貝到其他地方一樣可以使用。
下面我把兩種方式的腳本,都生成了exe可執行文件,大家可以直接點擊下載試用,如果下載不了,請直接去GitHub倉庫下載或者自己生成
修改代碼的可執行文件:data_dict_config.exe
手動輸入的可執行文件:data_dict_input.exe
完整代碼
為了方便部分人想偷懶,不直接去交友網站查看,我在這裡也貼一下其中的一個源碼出來吧(其實吧,我是覺得文章篇幅有點短,來湊字數的,大家明白就好,看透不說透)。
#!/usr/bin/env python 

# -*- coding: utf-8 -*- 

""" 自動生成MySQL數據表的數據字典支持多個 自動獲取數據庫連接信息,方便多用 author: gxcuizy date: 2020-04-30 """ 

import pymysql 

import os import time 

class DataDict(object): 

def __init__(self, connect_info): # 數據庫連接配置 

self.host_name = connect_info[0] 

self.user_name = connect_info[1] 

self.pwd = connect_info[2] 

self.db_name = connect_info[3] 

self.folder_name = 'mysql_dict' 


def run(self, table_str): 

"""腳本執行入口""" 

try: # 創建一個連接 

conn = pymysql.connect(self.host_name, self.user_name, self.pwd, self.db_name) # 用cursor()創建一個遊標對象 

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) except Exception: print('數據庫連接失敗,請檢查連接信息!') 

exit(1) 

table_list = table_str.split(',') 

for table_name in table_list: 

# 判斷表是否存在 

sql = "SHOW TABLES LIKE '%s'" % (table_name,) cursor.execute(sql) result_count = cursor.rowcount if result_count == 0: print('%s數據庫中%s表名不存在,無法生成……' % (self.db_name, table_name)) continue 

# 表註釋獲取 print('開始生成表%s的數據字典' % (table_name,)) 

sql = "show table status WHERE Name = '%s'" % (table_name,) 

cursor.execute(sql) result = cursor.fetchone() 

table_comment = result['Comment'] 

# 文件夾和文件處理

 file_path = self.folder_name + os.sep + table_name + '.md' self.deal_file(file_path) 

# 打開文件,準備寫入 

dict_file = open(file_path, 'a', encoding='UTF-8') 

dict_file.write('#### %s %s' % (table_name, table_comment)) 

dict_file.write('
| 字段名稱 | 字段類型 | 默認值 | 字段註釋 |') dict_file.write('
| --- | --- | --- | --- |') 

# 表結構查詢 field_str = "COLUMN_NAME,COLUMN_TYPE,COLUMN_DEFAULT,COLUMN_COMMENT" sql = "select %s from information_schema.COLUMNS where table_schema='%s' and table_name='%s'" % (field_str, self.db_name, table_name) 

cursor.execute(sql) 

fields = cursor.fetchall() 

for field in fields: 

column_name = field['COLUMN_NAME'] 

column_type = field['COLUMN_TYPE'] column_default = str(field['COLUMN_DEFAULT']) 

column_comment = field['COLUMN_COMMENT']

info = ' | ' + column_name + ' | ' + column_type + ' | ' + column_default + ' | ' + column_comment + ' | ' dict_file.write('' + info) 

# 關閉連接 print('完成表%s的數據字典' % (table_name,)) 

dict_file.close() 

cursor.close() 

conn.close() 


def deal_file(self, file_name): """處理存儲文件夾和文件""" # 不存在則創建文件夾 

if not os.path.exists(self.folder_name): os.mkdir(self.folder_name) # 刪除已存在的文件 if os.path.isfile(file_name): os.unlink(file_name) def test_conn(self, conn_info): """測試數據庫連接""" try: # 創建一個連接 pymysql.connect(conn_info[0], conn_info[1], conn_info[2], conn_info[3]) return True except Exception: return False # 程序執行入口 if __name__ == '__main__': # 數據數據連接信息 conn_info = input('請輸入mysql數據庫連接信息(格式為:主機IP,用戶名,登錄密碼,數據庫名),逗號分隔且輸入順序不能亂,例如:192.168.0.1,root,root,test_db:') 

conn_list = conn_info.split(',') 

while conn_info == '' or len(conn_list) != 4: conn_info = input('請正確輸入mysql數據庫連接信息(格式為:主機IP,用戶名,登錄密碼,數據庫名),逗號分隔且輸入順序不能亂,例如:192.168.0.1,root,root,test_db:') conn_list = conn_info.split(',') # 測試數據庫連接問題 

dd_test = DataDict(conn_list) db_conn = dd_test.test_conn(conn_list) while db_conn == False: conn_info = input('請正確輸入mysql數據庫連接信息(格式為:主機IP,用戶名,登錄密碼,數據庫名),逗號分隔且輸入順序不能亂,例如:192.168.0.1,root,root,test_db:') 

conn_list = conn_info.split(',') 

if len(conn_list) != 4: continue 

dd_test = DataDict(conn_list) 

db_conn = dd_test.test_conn(conn_list) # 輸入數據表名稱 

table_s = input('請輸入數據庫表名(例如:t_order),如需輸入多個表名請用英文逗號分隔(例如:t_order,t_goods),結束使用請輸入q:') 

dd = DataDict(conn_list) while table_s != 'q': dd.run(table_s) table_s = input('繼續使用請輸入數據庫表名(例如t_order),如需輸入多個表名請用英文逗號分隔(例如t_order,t_goods),結束使用請輸入q):') else: print('謝謝使用,再見……') 

time.sleep(1)


[niceskyabc ] Python3自動生成MySQL數據字典的markdown文本的實現已經有286次圍觀

http://coctec.com/docs/python/shhow-post-233297.html