1. 概述

        通过python连接本地数据库,创建Html网页,生成数据库的表清单及每张表的结构、修改语句等。步骤如下:


1. 从git远程拉取代码 2. 读取数据库每张表结构,生成md文档 3. 为表结构md文档添加change log 4. 每张表结构md转为html 5. 构建首页导航


2. 代码实现

2.1 从git远程拉取代码 

def downloadGit(download_path,clone_path,branch_name):
    # 从远程仓库更新代码
    if os.listdir(download_path):
        print('git pull to ', download_path)
        repo = Repo(download_path)

        ## 切换到最新分支
        repo.git.checkout(branch_name)
        repo.git.pull()
        cur_branch = repo.git.branch()
        print('current branch ', cur_branch,' 代码正在拉取中...')
    # 从远程仓库下载代码
    else:
        print('clone from ', clone_path)
        Repo.clone_from(clone_path,to_path=download_path,branch='master')

2.2 读取数据库每张表结构,生成md文档

数据库表结构查询,生成表结构md文档
1. 连接数据库
2. 读取表名
3. 遍历表,读取表结构
4. 每张表保存为md文档
 

import pymysql
import os

print('hello world——convertSqlToMd')
###########################   1. 连接数据库   #############################
def connectSql():
    # 打开数据库连接
    db = pymysql.connect(
        host="host_name",
        port=port_name,
        user='user_name',
        password='password_name',
        database='database_name'
    )

    db = connectSql()
    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()
    # 使用 execute()  方法执行 SQL 查询
    cursor.execute("SELECT VERSION()")
    # 使用 fetchone() 方法获取单条数据fetchone/所有数据fetchall
    data = cursor.fetchall()
    print ("Database version : %s " % data)
 
    # 关闭数据库连接
    db.close()
###########################   2. 读取表名   ##################################
selTables = "select table_name from information_schema.tables where table_schema='database_name' "

cursor.execute(selTables)
tableNames = cursor.fetchall()

###########################   3. 遍历表,读取表结构   #############################
###########################   4. 每张表保存为md文档   #############################
colName= '| Field    |Type    | Collation    | Null    |Key    | Default    | Extra    |Privileges    | Comment    |'
colDel = '| ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |'
try:
    for tableName in tableNames:
        # 遍历每张表
        tableName = tableName[0]
        # 描述表结构
        desTable = "show full columns from " + tableName
        # 执行表结构读取
        cursor.execute(desTable)
        tableStruc = cursor.fetchall()

        # 创建md文档,解析格式化数据
        with open(os.path.join(path , '%s.md'%tableName), 'w') as f:
            # 增加页面标题
            print(os.path.join(path , '%s.md'%tableName))
            f.writelines('## %s'%tableName + '\n')
            f.writelines('------ \n')
            f.writelines(colName + '\n')
            f.writelines(colDel + '\n')

            # 遍历该表结构每行
            for i in tableStruc:
                i = list(i)
                removeNone = ['null' if i == None else i for i in i]
                line = '|' + ' | '.join(removeNone) + ' | '

                f.writelines(line + '\n')
        f.close()

2.3 为表结构md文档添加change log

        组件代码结构如下,遍历该文件夹下所有时间日期的文件夹中的sql文件,sql文件名与实际表名一致,方便查找该表md文档,直接写入sql语句 

import datetime
import os
'''
1. 读取 DbScript组件 脚本语句
2. 添加到已有md文档中
'''
def addChangeLog(dbpath):

    ### md文档地址
    md_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'mySqlTabsMd')

    listdir =  os.listdir(dbpath)
    listdir.remove('deploy.yaml')
    listdir.sort(reverse=True)
    print('迭代文件夹:',listdir)

    for timedir in listdir:

        ### 遍历当前日期文件夹下 每个sql文件
        for foldername , subfolders , filenames in os.walk(dbpath +'\%s'%timedir):
              for filename in filenames:
                    if filename != 'rollback.sql':
                        ####### 读取表名 及 Sql 语句
                        tablename = filename.split('.')[0].split('-')[0]
                        filepath = os.path.join(foldername, filename)
                        sqlfile = open(filepath, "r",encoding='utf-8').read()
               
                     ####  将 change log 写进对应表md中
                    try:
                        md_file_path = os.path.join(md_path,tablename+'.md')

                        with open(md_file_path,'a') as f:
                            # 添加 时间
                            f.writelines('\n')
                            f.writelines(' - '+ timedir + '\n')
                      
                            f.writelines("```mysql \n")
                            f.write(sqlfile+ '\n')
                            f.writelines("```")
                        f.close()
                    except :
                        pass

2.4 每张表结构md转为html

        将每一个表结构md文档转化为html文件,方便首页导航直接跳转。其中exts为markdown类型扩展包,能够将md文档中的样式正常加载转换为Html的样式,github.css及dracula.css为样式文件,使html样式正常/代码高亮显示等..

exts = ['markdown.extensions.extra', 'markdown.extensions.codehilite', 'markdown.extensions.tables', 'markdown.extensions.toc']
'''
md文档转为html格式
1. 格式化html页面
2. md————>html
3. 输出保存html
'''

import markdown
import os
print('hello world——md2html')
####### 1. 读取文件
def readFile(exts):
    path = os.path.dirname(os.path.abspath(__file__))
    print(path)
    ### 变量定义
    html = '''<!DOCTYPE html>
              <head>
                  <meta charset="UTF-8">
                  <meta name="viewport" content="width=device-width, initial-scale=1, minimal-ui">
                  <title>{}</title>

                   <link rel="stylesheet" href="../css/github.css">
                   <link rel="stylesheet" href="../css/dracula.css">
              </head>
              <body>
                   <article class="markdown-body">
                      {}
                  </article>
              </body>
          </html>
          '''
    for input_file in os.listdir(path+'\mySqlTabsMd'):
        table_name = input_file.split('.')[0]
        output_file =os.path.join(path,'mySqlTabsHtml' , table_name +'.html')
        print(input_file,output_file)
        md_file_path  = os.path.join(path,'mySqlTabsMd',input_file)
        md_file = open(md_file_path,"r")
        html_body_txt = md_file.read()
        md_file.close()

        md2html(table_name,html_body_txt,output_file,html,exts)

####### 2. md文档转换,html文件保存
#######    参数:标题,Htmlbody内容,输出路径,html结构参数,md扩展包
def md2html(title,html_body_txt,output_file,html,exts):

    ### md文件转为 html
    md = markdown.Markdown(extensions = exts)
    html_body = md.convert(html_body_txt)
    ### html文件保存
    html = html.format(title, html_body)
    html_file = open(output_file,"w",encoding='utf-8')
    html_file.write(html)
    html_file.close()

2.5 构建首页导航

        读取数据库所有表名,循环换行写入index.md,调用md2html 方法,生成首页的Html文件

# 执行sql语句
db = connectSql()
cursor = db.cursor()
selTables = "select table_name from information_schema.tables where table_schema='zytbmdb' "
cursor.execute(selTables)
tableNames = cursor.fetchall()

注意, title为表名,最好md文档也保持同名

for i in tableNames:
    title =  i[0]
    link = 'mySqlTabsHtml/%s.html'%title
    content = "- [{}]({})".format(title,link)
    print(content)
    f.write(content+'\n')