99 lines
3.5 KiB
Python
99 lines
3.5 KiB
Python
# -*- 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 = []
|
|
# 从脏数据中取出表名
|
|
# print dirty_table_name[i].strip()
|
|
name = re.match(self.name_pattern, dirty_table_name[i].strip())
|
|
if name != None:
|
|
# print name.group(1)
|
|
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))
|
|
else:
|
|
tmp.append('')
|
|
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 |