diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/FileParserClass.py b/FileParserClass.py new file mode 100644 index 0000000..be51d92 --- /dev/null +++ b/FileParserClass.py @@ -0,0 +1,93 @@ +# -*- coding:utf-8 -*- +import re +class FileParser: + + def __init__(self): + pass + + + # 定义分离SQL文件匹配模式 + # table_pattern = r'CREATE TABLE([\s\S]*?)LOCK TABLES' #分离表 + table_pattern = r'CREATE TABLE([\s\S]*?);' + name_pattern = r'`(.*?)`' # 获取表名称或字段名称 + table_content_pattern = r'COMMENT=\'(.*?)\'' #获取表详情 + + def separatTable(self, content): + '''将SQL文件中各个表分离开来 + :param content:文件内容 + :return:表分离后的内容 + ''' + pattren = re.compile(self.table_pattern) + table_list = re.findall(pattren, content) + return table_list + + def parserTableName(self, table_list): + ''' + 解析出数据库中所有表的表名 + 列表中前者为表名,后者为表含义 + :param table_list: + :return: + ''' + dirty_table_name = [] + dirty_table_content = [] + table_name = [] + # 取出表名和表含义行脏数据 + for table in table_list: + tmp = table.split('\n') + dirty_table_name.append(tmp[0]) + dirty_table_content.append(tmp[-1]) + + for i in range(len(dirty_table_name)): + tmp = [] + # 从脏数据中取出表名 + name = re.match(self.name_pattern, dirty_table_name[i].strip()) + if name != None: + tmp.append(name.group(1)) + + # 从脏数据中取出表含义 + content = re.match(self.table_content_pattern, dirty_table_content[i].split(' ')[-1]) + if content != None: + tmp.append(content.group(1)) + table_name.append(tmp) + return table_name + + def parserColumn(self, table_list, table_name): + ''' + 获取字段情况 + :param table_list: separatTable中分离出的数据 + :param table_name: parserTableName中解析出的数据 + :return: + ''' + dirty_column_list = [] + for table in table_list: + dirty_column_list.append(table.split('\n')[1:-1]) + table_data = [] + + for i in range(len(dirty_column_list)): + dirty_column = [] + dirty_column = dirty_column_list[i] + column_tmp = [] + ''' + 先取两边空格 + 用空格分割 + 第一个有没有``,有取出来,无舍弃 + ''' + for column in dirty_column: + tmp_list = column.strip().split(' ') + column_name = re.match(r'`(.*?)`', tmp_list[0]) + if column_name != None: + column_name = column_name.group(1) + column_type = tmp_list[1] + # TODO:此处无法正确匹配,使用取列表最后一项,可能会有bug + # column_comment = re.match(r'COMMENT \'(.*?)\'', column.strip()) + # if column_comment is not None: + # column_comment = column_comment.group(1) + # else: + # column_comment = '' + if '\'' in tmp_list[-1]: + column_comment = tmp_list[-1][1:-2] + else: + column_comment = '' + column_tmp.append([column_name, column_type, column_comment]) + table_data.append([table_name[i], column_tmp]) + return table_data \ No newline at end of file diff --git a/MarkdownBuildClass.py b/MarkdownBuildClass.py new file mode 100644 index 0000000..0371118 --- /dev/null +++ b/MarkdownBuildClass.py @@ -0,0 +1,6 @@ +# -*- coding:utf-8 -*- +import re +content = "`id` mediumint(8) NOT NULL AUTO_INCREMENT COMMENT='hello'," +pattern = r'NOT(.*?)AUTO_INCREMENT' +print re.match(pattern, content.strip()).group(1) +# print(re.match(pattern, content).group(1)) \ No newline at end of file diff --git a/build.py b/build.py new file mode 100644 index 0000000..34f0fbd --- /dev/null +++ b/build.py @@ -0,0 +1,34 @@ +# -*- coding:utf-8 -*- +# Author : 我才是二亮 (unstring@163.com) +import sys +from FileParserClass import FileParser + +if __name__ == '__main__': + + content = '' + file = '' + if (len(sys.argv) < 2): + exit('参数有误,请使用-help参数,了解文件使用规则') + + dir = sys.argv[1] + + try: + file = open(dir) + except IOError, e: + exit(e) + try: + content = file.read() + except: + exit('文件读取失败') + finally: + file.close() + + file_parser = FileParser() + # 将文件分离为每张表 + table_list = file_parser.separatTable(content) + # 解析出表中表名及表详情 + table_name = file_parser.parserTableName(table_list) + # 解析出每张表字段情况并与表名表详情组合 + table_data = file_parser.parserColumn(table_list, table_name) + + print table_data \ No newline at end of file