Python3自動(dòng)生成MySQL數(shù)據(jù)字典的markdown文本的實(shí)現(xiàn)
為啥要寫這個(gè)腳本
五一前的準(zhǔn)備下班的時(shí)候,看到同事為了做數(shù)據(jù)庫的某個(gè)表的數(shù)據(jù)字典,在做一個(gè)復(fù)雜的人工操作,就是一個(gè)字段一個(gè)字段的純手?jǐn)],那速度可想而知是多么的折磨和鍛煉人的意志和耐心,反正就是很耗時(shí)又費(fèi)力的活,關(guān)鍵是工作效率太低了,于是就網(wǎng)上查了一下,能否有在線工具可用,但是并沒有找到理想和如意的,于是吧,就干脆自己擼一個(gè),一勞永逸,說干就干的那種……
先屢一下腳本思路
第一步:輸入或修改數(shù)據(jù)庫連接配置信息,以及輸入數(shù)據(jù)表名
第二步:利用pymysql模塊連接數(shù)據(jù)庫,并判斷數(shù)據(jù)表是否存在
第三步:獲取數(shù)據(jù)表的注釋
第四步:存儲(chǔ)文件夾和文件處理,刪除已存在的文件避免重復(fù)寫入
第五步:先寫入Markdown的表頭部信息
第六步:從information_schema中查詢表結(jié)構(gòu)和相關(guān)信息
第七步:依次拼裝每個(gè)字段的Markdown文本寫入,結(jié)束并關(guān)閉相關(guān)連接
運(yùn)行環(huán)境
Python運(yùn)行環(huán)境:Windows + python3.6
用到的模塊:pymysql、os、time、pyinstaller
如未安裝的模塊,請(qǐng)使用pip instatll xxxxxx進(jìn)行安裝,例如:pip install pyinstaller
獲取數(shù)據(jù)庫連接信息的兩種方式
然是要做數(shù)據(jù)字典,那么肯定就需要先連接數(shù)據(jù)庫,而連接數(shù)據(jù)庫,自然就需要先知道數(shù)據(jù)庫的基本信息:IP地址、用戶名、登錄密碼、數(shù)據(jù)庫名等……
為了方便,我這里寫了兩種配置MySQL連接的方法:第一種是直接配置在代碼里,直接修改代碼里的連接信息就可以了;另外一種就是通過手動(dòng)輸入鏈接信息,不用修改代碼,方便快速多用。具體的完整源碼,我都上傳到同性交友網(wǎng)站GitHub了,可以點(diǎn)下面的鏈接查看……
- 修改代碼的完整源碼:data_dict_config.py
- 手動(dòng)輸入的完整源碼:data_dict_input.py
生成可執(zhí)行文件
為了方便不同的人群方便快速的使用,可以不用安裝Python環(huán)境來執(zhí)行py腳本文件,我把相關(guān)腳本打包成Windows可直接執(zhí)行的exe文件,下載雙擊運(yùn)行即可(可能有的系統(tǒng)需要管理員權(quán)限運(yùn)行),打包的方式很簡(jiǎn)單,就是利用pyinstaller
模塊進(jìn)行快速打包,省時(shí)省力,具體更多用法大家可以網(wǎng)上查一下。
打包命令為: pyinstaller -F -i favicon.ico data_dict_input.py
執(zhí)行這個(gè)命令后,就會(huì)在當(dāng)前目錄下生成一個(gè)dict和其他的文件夾和相關(guān)文件,其中,打開dict,下面會(huì)生成一個(gè)文件名相同的exe文件data_dict_input.exe
,雙擊這個(gè)文件就可以打開了,拷貝到其他地方一樣可以使用。
下面我把兩種方式的腳本,都生成了exe可執(zhí)行文件,大家可以直接點(diǎn)擊下載試用,如果下載不了,請(qǐng)直接去GitHub倉庫下載或者自己生成
- 修改代碼的可執(zhí)行文件:data_dict_config.exe
- 手動(dòng)輸入的可執(zhí)行文件:data_dict_input.exe
完整代碼
為了方便部分人想偷懶,不直接去交友網(wǎng)站查看,我在這里也貼一下其中的一個(gè)源碼出來吧(其實(shí)吧,我是覺得文章篇幅有點(diǎn)短,來湊字?jǐn)?shù)的,大家明白就好,看透不說透)。
#!/usr/bin/env python # -*- coding: utf-8 -*- """ 自動(dòng)生成MySQL數(shù)據(jù)表的數(shù)據(jù)字典支持多個(gè) 自動(dòng)獲取數(shù)據(jù)庫連接信息,方便多用 author: gxcuizy date: 2020-04-30 """ import pymysql import os import time class DataDict(object): def __init__(self, connect_info): # 數(shù)據(jù)庫連接配置 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): """腳本執(zhí)行入口""" try: # 創(chuàng)建一個(gè)連接 conn = pymysql.connect(self.host_name, self.user_name, self.pwd, self.db_name) # 用cursor()創(chuàng)建一個(gè)游標(biāo)對(duì)象 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) except Exception: print('數(shù)據(jù)庫連接失敗,請(qǐng)檢查連接信息!') 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數(shù)據(jù)庫中%s表名不存在,無法生成……' % (self.db_name, table_name)) continue # 表注釋獲取 print('開始生成表%s的數(shù)據(jù)字典' % (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) # 打開文件,準(zhǔn)備寫入 dict_file = open(file_path, 'a', encoding='UTF-8') dict_file.write('#### %s %s' % (table_name, table_comment)) dict_file.write('\n | 字段名稱 | 字段類型 | 默認(rèn)值 | 字段注釋 |') dict_file.write('\n | --- | --- | --- | --- |') # 表結(jié)構(gòu)查詢 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('\n ' + info) # 關(guān)閉連接 print('完成表%s的數(shù)據(jù)字典' % (table_name,)) dict_file.close() cursor.close() conn.close() def deal_file(self, file_name): """處理存儲(chǔ)文件夾和文件""" # 不存在則創(chuàng)建文件夾 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): """測(cè)試數(shù)據(jù)庫連接""" try: # 創(chuàng)建一個(gè)連接 pymysql.connect(conn_info[0], conn_info[1], conn_info[2], conn_info[3]) return True except Exception: return False # 程序執(zhí)行入口 if __name__ == '__main__': # 數(shù)據(jù)數(shù)據(jù)連接信息 conn_info = input('請(qǐng)輸入mysql數(shù)據(jù)庫連接信息(格式為:主機(jī)IP,用戶名,登錄密碼,數(shù)據(jù)庫名),逗號(hào)分隔且輸入順序不能亂,例如:192.168.0.1,root,root,test_db:') conn_list = conn_info.split(',') while conn_info == '' or len(conn_list) != 4: conn_info = input('請(qǐng)正確輸入mysql數(shù)據(jù)庫連接信息(格式為:主機(jī)IP,用戶名,登錄密碼,數(shù)據(jù)庫名),逗號(hào)分隔且輸入順序不能亂,例如:192.168.0.1,root,root,test_db:') conn_list = conn_info.split(',') # 測(cè)試數(shù)據(jù)庫連接問題 dd_test = DataDict(conn_list) db_conn = dd_test.test_conn(conn_list) while db_conn == False: conn_info = input('請(qǐng)正確輸入mysql數(shù)據(jù)庫連接信息(格式為:主機(jī)IP,用戶名,登錄密碼,數(shù)據(jù)庫名),逗號(hào)分隔且輸入順序不能亂,例如: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) # 輸入數(shù)據(jù)表名稱 table_s = input('請(qǐng)輸入數(shù)據(jù)庫表名(例如:t_order),如需輸入多個(gè)表名請(qǐng)用英文逗號(hào)分隔(例如:t_order,t_goods),結(jié)束使用請(qǐng)輸入q:') dd = DataDict(conn_list) while table_s != 'q': dd.run(table_s) table_s = input('繼續(xù)使用請(qǐng)輸入數(shù)據(jù)庫表名(例如t_order),如需輸入多個(gè)表名請(qǐng)用英文逗號(hào)分隔(例如t_order,t_goods),結(jié)束使用請(qǐng)輸入q):') else: print('謝謝使用,再見……') time.sleep(1)
最后
到此這篇關(guān)于Python3自動(dòng)生成MySQL數(shù)據(jù)字典的markdown文本的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python3自動(dòng)生成markdown文本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL 8.0數(shù)據(jù)字典的初始化與啟動(dòng)流程
- Mysql?json類型字段Java+Mybatis數(shù)據(jù)字典功能的實(shí)踐方式
- 詳解PyMySQL插入字典類型的數(shù)據(jù)
- Mysql生成數(shù)據(jù)字典的原理與實(shí)例
- Python保存dict字典類型數(shù)據(jù)到Mysql并自動(dòng)創(chuàng)建表與列
- 解析MySQL8.0新特性——事務(wù)性數(shù)據(jù)字典與原子DDL
- php生成mysql的數(shù)據(jù)字典
- MySQL 8.0數(shù)據(jù)字典緩存管理機(jī)制解析
相關(guān)文章
Django正則URL匹配實(shí)現(xiàn)流程解析
這篇文章主要介紹了Django正則URL匹配實(shí)現(xiàn)流程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11conda與jupyter notebook kernel核環(huán)境不一致的問題解決
本文記錄在使用conda時(shí)候出現(xiàn)的問題,jupter notebook中的環(huán)境不一致導(dǎo)致的,具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05在Python程序中實(shí)現(xiàn)分布式進(jìn)程的教程
這篇文章主要介紹了在Python程序中實(shí)現(xiàn)分布式進(jìn)程的教程,在多進(jìn)程編程中十分有用,示例代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04Python matplotlib以日期為x軸作圖代碼實(shí)例
這篇文章主要介紹了Python matplotlib以日期為x軸作圖代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Qt通過QGraphicsview實(shí)現(xiàn)簡(jiǎn)單縮放及還原效果
本文主要介紹通過QGraphicsview實(shí)現(xiàn)簡(jiǎn)單的縮放以及縮放后還原原始大小,通過scale可以對(duì)view進(jìn)行放大或縮小,具體內(nèi)容詳情跟隨小編一起看看吧2021-09-09Python中的二維數(shù)組實(shí)例(list與numpy.array)
下面小編就為大家分享一篇Python中的二維數(shù)組實(shí)例(list與numpy.array),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04python用requests實(shí)現(xiàn)http請(qǐng)求代碼實(shí)例
這篇文章主要介紹了python用requests實(shí)現(xiàn)http請(qǐng)求過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10python matplotlib擬合直線的實(shí)現(xiàn)
這篇文章主要介紹了python matplotlib擬合直線的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11django filters實(shí)現(xiàn)數(shù)據(jù)過濾的示例代碼
這篇文章主要介紹了django filters實(shí)現(xiàn)數(shù)據(jù)過濾的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05