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