实现解析SQL文件表结构
This commit is contained in:
Generated
+6
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -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
|
||||
@@ -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))
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user