用Python生成MySql資料字典

老鷹發表於2017-03-31

專案的資料庫字典表是一個很重要的文件。通過此文件可以清晰的瞭解資料表結構及開發者的設計意圖。
通常為了方便我都是直接在資料庫中建表,然後通過工具匯出資料字典。

在Mysql資料庫中有一個information_schema庫,它提供了訪問資料庫後設資料的方式。
什麼是後設資料呢?就是關於資料的資料,如資料庫名、表名、列的資料型別、訪問許可權等。
SCHEMATA表:提供了當前mysql例項中所有資料庫的資訊。是show databases的結果取之此表。
TABLES表:提供了關於資料庫中的表的資訊(包括檢視)。詳細表述了某個表屬於哪個schema,表型別,表引擎,建立時間等資訊。
show tables from schemaname的結果取之此表。
COLUMNS表:提供了表中的列資訊。詳細表述了某張表的所有列以及每個列的資訊.
show columns from schemaname.tablename的結果取之此表。

瞭解了生成資料字典的原理後看一下實現程式碼:

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

import mysql.connector as mysql
import sys
import getopt
reload(sys)
sys.setdefaultencoding(`utf8`)


def usage():
    print `help:`
    print `--host db server,default localhost`
    print `--port db port,default 3306`
    print `--user db username,default root`
    print `--password db password,default blank`
    print `--database db name`
    print `--output markdown output file,default current path`

if __name__ == `__main__`:
    try:
        opts,args = getopt.getopt(sys.argv[1:],"h",["help","host=","port=","database=","user=","password=","output="])
    except getopt.GetoptError:
        sys.exit()
    if `help` in args:
        usage()
        sys.exit()
        print opts
    host = `localhost`
    user = `root`
    password = ``
    database = ``
    port = 3306
    output = `./markdown.out`

    for op,value in opts:
        if op == `--host`:
            host = value
        elif op == `--port`:
            port = value
        elif op == `--database`:
            database = value
        elif op == `--user`:
            user = value
        elif op == `--password`:
            password = value
        elif op == `--output`:
            output = value
        elif op == `-h`:
            usage()
            sys.exit()
        if database == ``:
            usage()
        #    sys.exit()
    conn = mysql.connect(host=host,port=port,user=user,password=password,database=`information_schema`)
    cursor = conn.cursor()
    cursor.execute("select table_name,table_comment from information_schema.tables where table_schema=`%s` and table_type=`base table`" % database)
    tables = cursor.fetchall()
    
    markdown_table_header = """### %s (%s) 
    欄位名 | 欄位型別 | 預設值 | 註解
    ---- | ---- | ---- | ---- 
    """
    markdown_table_row = """%s | %s | %s | %s
    """
    f = open(output,`w`)
    for table in tables:
        cursor.execute("select COLUMN_NAME,COLUMN_TYPE,COLUMN_DEFAULT,COLUMN_COMMENT from information_schema.COLUMNS where table_schema=`%s` and table_name=`%s`"% (database,table[0]))
        tmp_table = cursor.fetchall()
        p = markdown_table_header % table;
        for col in tmp_table:
            p += markdown_table_row % col
        f.writelines(p)
        f.writelines(`
`)
    f.close()
    print `generate markdown success!`

上面的執行結果會輸出 markdown 格式的檔案。

資料庫表名

欄位名 欄位型別 預設值 註解

後面會寫一篇用Python生成資料庫關係圖。

相關文章