在数据库设计完成之后, 常常需要在 wiki 或其他文档中保存一份数据库中所有表的 desc 描述, 尤其是每个字段的含义和用途。 手动去生成自然是不可取的。 因此, 我编写了一个简单的 python 程序,可以自动生成数据库中所有表的 desc 描述, 并以可读格式输出。
# -*- coding: utf-8 -*- # ------------------------------------------------------------------------------- # Name: db_tables_descs.py # Purpose: generate the tables that describe the meanings of fields in db # # Author: qin.shuq # # Created: 2014/11/17 # Output: desc.txt # recording the tables that describe the meanings of fields in db #------------------------------------------------------------------------------- #!/usr/bin/env python import MySQLdb globalFieldDescs = (‘Field‘, ‘Type‘, ‘Null‘, ‘Key‘, ‘Default‘, ‘Extra‘) globalDescFile = ‘desc.txt‘ conflictedWithMysqlKeywords = set([‘group‘]) fieldDescMapping = { ‘id‘: ‘唯一标识‘, ‘is_deleted‘: ‘是否逻辑删除‘, ‘status‘: ‘实体状态‘, ‘type‘: ‘实体类型‘, ‘priority‘: ‘优先级‘, ‘password‘: ‘密码‘, ‘ip‘: ‘ip 地址‘, ‘mac‘: ‘mac 地址‘, ‘protocol‘: ‘访问协议‘, ‘user_id‘: ‘用户唯一标识‘ } class DB(object): def __init__(self): self.conn = MySQLdb.connect(db=‘mysql‘,host=‘127.0.0.1‘,user=‘root‘,passwd=‘123456‘) def obtainDB(self): return self def query(self, sql): cursor = self.conn.cursor() cursor.execute(sql) result = cursor.fetchall() cursor.close() return list(result) def formatCols(fieldDesc): return "%-16s %-24s %-5s %-8s %-8s %-30s" % fieldDesc def withNewLine(astr): return astr + ‘\n‘ def commonFieldsProcess(fieldDescList): fieldName = fieldDescList[0] fieldDesc = fieldDescMapping.get(fieldName) desclen = len(fieldDescList) if fieldDesc is None: if fieldName.startswith(‘gmt_c‘): fieldDesc = ‘创建时间‘ elif fieldName.startswith(‘gmt_m‘): fieldDesc = ‘修改时间‘ else: fieldDesc = fieldDescList[desclen-1] fieldDescList[desclen-1] = fieldDesc def formatF(fieldDescTuple): fieldDescList = list(fieldDescTuple) fieldLen = len(fieldDescList) for i in range(fieldLen): if fieldDescList[i] is None: fieldDescList[i] = ‘NULL‘ else: fieldDescList[i] = str(fieldDescList[i]) commonFieldsProcess(fieldDescList) return formatCols(tuple(fieldDescList)) def format(tableDesc): desc = ‘‘ for fieldDescTuple in tableDesc: desc += withNewLine(formatF(fieldDescTuple)) return desc def descDb(givenDb): tablesRet = givenDb.query("show tables;") print tablesRet tableNames = [table[0] for table in tablesRet] desc = ‘‘ for tablename in tableNames: if tablename in conflictedWithMysqlKeywords: tablename = ‘`‘ + tablename + ‘`‘ descSql = "desc " + tablename tableDesc = givenDb.query(descSql) desc += withNewLine(tablename) desc += withNewLine(formatCols(globalFieldDescs)).decode(‘utf-8‘) desc += withNewLine(format(tableDesc)).decode(‘utf-8‘) desc += withNewLine(‘‘).decode(‘utf-8‘) return desc def main(): descFile = open(globalDescFile, ‘w‘) db = DB() database = db.obtainDB() desc = descDb(database) descFile.write(desc.encode(‘utf-8‘)) descFile.close() if __name__ == ‘__main__‘: main()
时间: 2024-10-04 05:37:40