1. 程式人生 > 資料庫 >Python3自動生成MySQL資料字典的markdown文字的實現

Python3自動生成MySQL資料字典的markdown文字的實現

為啥要寫這個指令碼

五一前的準備下班的時候,看到同事為了做資料庫的某個表的資料字典,在做一個複雜的人工操作,就是一個欄位一個欄位的純手擼,那速度可想而知是多麼的折磨和鍛鍊人的意志和耐心,反正就是很耗時又費力的活,關鍵是工作效率太低了,於是就網上查了一下,能否有線上工具可用,但是並沒有找到理想和如意的,於是吧,就乾脆自己擼一個,一勞永逸,說幹就幹的那種……

先屢一下指令碼思路

第一步:輸入或修改資料庫連線配置資訊,以及輸入資料表名

第二步:利用pymysql模組連線資料庫,並判斷資料表是否存在

第三步:獲取資料表的註釋

第四步:儲存資料夾和檔案處理,刪除已存在的檔案避免重複寫入

第五步:先寫入Markdown的表頭部資訊

第六步:從information_schema中查詢表結構和相關資訊

第七步:依次拼裝每個欄位的Markdown文字寫入,結束並關閉相關連線

執行環境

Python執行環境:Windows + python3.6
用到的模組:pymysql、os、time、pyinstaller
如未安裝的模組,請使用pip instatll xxxxxx進行安裝,例如:pip install pyinstaller

獲取資料庫連線資訊的兩種方式

然是要做資料字典,那麼肯定就需要先連線資料庫,而連線資料庫,自然就需要先知道資料庫的基本資訊:IP地址、使用者名稱、登入密碼、資料庫名等……

為了方便,我這裡寫了兩種配置MySQL連線的方法:第一種是直接配置在程式碼裡,直接修改程式碼裡的連線資訊就可以了;另外一種就是通過手動輸入連結資訊,不用修改程式碼,方便快速多用。具體的完整原始碼,我都上傳到同性交友網站GitHub了,可以點下面的連結檢視……

  • 修改程式碼的完整原始碼:data_dict_config.py
  • 手動輸入的完整原始碼:data_dict_input.py

生成可執行檔案

為了方便不同的人群方便快速的使用,可以不用安裝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('\n | 欄位名稱 | 欄位型別 | 預設值 | 欄位註釋 |')
  dict_file.write('\n | --- | --- | --- | --- |')
  # 表結構查詢
  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)
  # 關閉連線
  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,test_db:')
 conn_list = conn_info.split(',')
 while conn_info == '' or len(conn_list) != 4:
 conn_info = input('請正確輸入mysql資料庫連線資訊(格式為:主機IP,')
 # 測試資料庫連線問題
 dd_test = DataDict(conn_list)
 db_conn = dd_test.test_conn(conn_list)
 while db_conn == False:
 conn_info = input('請正確輸入mysql資料庫連線資訊(格式為:主機IP,')
 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)

最後

到此這篇關於Python3自動生成MySQL資料字典的markdown文字的實現的文章就介紹到這了,更多相關Python3自動生成markdown文字內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!