An example of a decorator

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



Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324779114&siteId=291194637