Two modules are used to achieve the requirements
. sql_func.py is used to perform sql operations.
mock_sql.py is used to parse the user's input
. In mock_sql.py, the decorator parse_user_input is used to parse the user's input. Through this decorator, the user is obtained. The table names, field names, and qualifications (such as the conditions after the where clause) corresponding to different SQL statements, and the contents of the values in the insert operation
use reflection to match different insert/delete/update/select The specific function
is implemented in sql_func.py is string parsing, the content is obtained through string parsing, and written to a file
File name: sql_func.py
# coding:utf-8
import re
def insert(action_name, dbname, fieldname, condition_limit, condition_values):
print "action:", action_name, dbname, fieldname, condition_limit
# insert into staff (name, dept, phone, eroll_date) values (li, DEV, 123456677, 20110101)
write_file(dbname, fieldname, condition_limit, condition_values)
def delete(action_name, dbname, fieldname, condition_values):
print "action:", action_name, dbname, fieldname, condition_limit
def update(action_name, dbname, fieldname, condition_limit, condition_values):
print "action:", action_name, dbname, fieldname, condition_limit
def select(action_name, dbname, fieldname, condition_limit, condition_values):
print "action:", action_name, dbname, fieldname, condition_limit
read_file(dbname, fieldname, condition_limit)
def read_file(fname, fieldname, condition_limit):
with open(fname, "r") as fd:
for line in fd:
if fieldname == "*" and condition_limit == "no":
print line.strip("\n")
elif fieldname == "*" and condition_limit != "no":
condition_item = condition_limit.strip(";").split()[0].strip('"')
condition_signal = condition_limit.strip(";").split()[1]
condition_value = condition_limit.strip(";").split()[2].strip('"')
if condition_item == "name" and condition_signal == "=":
if line.strip("\n").split(",")[1] == condition_value:
print line.strip("\n")
elif condition_item == "dept":
if line.strip("\n").split(",")[2] == condition_value:
print line.strip("\n")
elif condition_item == "eroll_date" and condition_signal == "like":
if line.strip("\n").split(",")[4].__contains__(condition_value):
print line.strip("\n")
def write_file(fname, fieldname, condition_limit, condition_values):
with open(fname ,"a+") as fd:
item = ",".join(condition_values.split(","))
record = re.sub(r'"', "", item.strip())
fd.writelines(str(8) + "," + record)
File name: mock_sql.py
# coding:utf-8
'''
sql_func是导入的另外一个模块,即位于同级目录的sql_func.py
需求语法:
insert into tablename
delete from tablename
delete from tablename where clause
update tablename set filedname=value
update tablename set (fieldname1, fieldname2, fieldname3...) values (val1, val2, val3...)
select * from tablename where clasuse
select filedname from tablename where clause
'''
import re
import sql_func
def parse_user_input(func):
# 拆分字符串获得表名的正则表达式
re_parse_dbname = r"' '+|from|update|into"
# 拆分字符串获得字段名的正则表达式
re_field_name = r"select|from|set|where|into|values|="
# 拆分字符串获得where条件的正则表达式
re_condition = r"where"
# 拆分是insert into插入记录的情况下的values的正则表达式
re_insert_values = r"into|values"
def wrapper_parse(user_input):
user_action_pointer, user_line, user_sql = func(user_input)
if user_action_pointer in ["select", "delete","insert", "update"]:
user_action_pointer, user_sql, user_line = func(user_input)
dbname = re.split(re_parse_dbname, user_line)[1].lstrip().split()[0].rstrip(";")
fieldname = re.sub(r"(^.* )\(", "", re.split(re_field_name, user_line)[1]).strip(" )")
if user_action_pointer in ["select", "delete", "update"]:
condition = re.split(re_condition, user_line)
if len(condition) == 1:
condition_limit = "no"
else:
condition_limit = condition[1]
elif user_action_pointer == "insert":
condition_values = re.split(re_insert_values, user_line)
sql_action(user_action_pointer, dbname, fieldname, condition_limit, condition_values)
else:
return "invalid action"
exit(1)
return wrapper_parse
@parse_user_input
def parse_user_input(user_input):
user_action_pointer = user_input["user_sql_list"][0]
user_sql = user_input["user_sql_list"]
user_line = user_input["user_line"]
return user_action_pointer, user_sql, user_line
def sql_action(action_name, dbname, fieldname, condition_limit):
if action_name in ["select", "insert", "update", "delete"]:
if hasattr(sql_func, action_name):
func = getattr(sql_func, action_name)
result = func(action_name, dbname, fieldname, condition_limit)
def input():
user_results = dict()
user_line = raw_input("input your sql:")
user_sql_list = user_line.rstrip(";").split()
user_results["user_line"] = user_line
user_results["user_sql_list"] = user_sql_list
return user_results
if __name__ == "__main__":
user_input = input()
parse_user_input(user_input)
1. Zhang, DEV, 13600010001, 2010101
2 WANG, DEV, 1360020002 , 20110101
3 ,13600060008,20150602 7,wu,OPS,13600070009,20160703