最近自己想把sql文件包含的数据结构解析出来,用python解析,也算是学习python吧。
开始肯定写的比较naive:
原始的sql文件是:
/*
Navicat MySQL Data Transfer
Source Server : 11
Source Server Version : 50515
Source Host : 192.168.106.61:3306
Source Database : game_002
Target Server Type : MYSQL
Target Server Version : 50515
File Encoding : 65001
Date: 2015-05-23 20:31:26
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `test`
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`test1` int(11) NOT NULL DEFAULT '0',
`test2` varchar(24) DEFAULT NULL,
PRIMARY KEY (`test1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of test
-- ----------------------------
解析代码是:
import sys
type_num = 1
type_str = 2
class data_struct:
name = ""
type = 1
type_str_ = ""
class store:
table_name = "";
vari_list = []
def issubstr(s1, s2):
return s1 in s2
num = 0
store_data = store()
f = open("test.sql")
is_begin_parse = False
line = f.readline()
def get_between(str):
num1 = line.find("`", 1)
num2 = line.find("`", num1+1)
if num2 -num1 < 0:
return Null
res = line[(num1+1):num2]
#print res
return res
while line:
if issubstr("CREATE TABLE", line):
store.table_name = get_between(line)
is_begin_parse = True
elif issubstr("PRIMARY KEY", line):
line = f.readline()
continue
elif issubstr("ENGINE=InnoDB DEFAULT", line):
is_begin_parse = False
elif is_begin_parse == True:
num = num +1
data_struct_ = data_struct()
data_struct_.name = get_between(line)
if issubstr("varchar", line):
data_struct_.type = type_str
data_struct_.type_str_ = "std::string"
store.vari_list.insert(num, data_struct_)
line = f.readline()
f.close()
def get_member_function(meber_name, type):
string_begin = "\n " + type + " get_" + meber_name + "(){\n return " + meber_name + ";\n }"
return string_begin
def set_member_function(meber_name, type):
string_begin = "\n void set_" + meber_name + "(" + type + " "+ meber_name + "_){\n " + meber_name + " = " + meber_name + "_; \n}\n"
return string_begin
def get_member(meber_name, type):
string_begin = "\n " + type + " " + meber_name + ";"
return string_begin
res_file_header_name = store.table_name + ".h"
res_file_source_name = store.table_name + ".cc"
res_file_header = open(res_file_header_name, "wb+")
res_file_source = open(res_file_source_name, "wb+")
string_begin = "#ifndef _" + store.table_name + "_\n#define _" + store.table_name + "_\n" + "#include <string>\n"
res_file_header.write(string_begin)
string_begin = "namespace {\nclass " + store.table_name + "{\n"
res_file_header.write(string_begin)
string_begin = " public:\n"
res_file_header.write(string_begin)
for data_ in store.vari_list:
data_name = data_.name + "_"
if data_.type == 1:
res_file_header.write(get_member_function(data_.name, data_.type_str_))
res_file_header.write(set_member_function(data_.name, data_.type_str_))
elif data_.type == 2:
res_file_header.write(get_member_function(data_.name, data_.type_str_))
res_file_header.write(set_member_function(data_.name, data_.type_str_))
string_begin = "\n private:"
res_file_header.write(string_begin)
for data_ in store.vari_list:
data_name = data_.name + "_"
if data_.type == 1:
res_file_header.write(get_member(data_.name, data_.type_str_))
elif data_.type == 2:
res_file_header.write(get_member(data_.name, data_.type_str_))
res_file_header.write("\n}\n}\n#endif")
res_file_header.close()