# -*- coding: UTF-8 -*- # find name.age from staff_table where age > 22 DB_FILE = 'staff.db' COLUMNS = ['id','name','age','phone','dept','enrolled_date'] def print_log(msg,log_type="info"): if log_type == "info": print(msg) elif log_type == "error": print("\033[31;1m%s\033[0m"%msg) def load_db(db_file): #加载员工信息表,并转成指定的格式 data = {} for i in COLUMNS: data[i] = [] f = open(db_file,mode='r',encoding='gbk') for line in f: staff_id,name,age,phone,dept,enrolled_date = line.split(',') data['id'].append(staff_id) data['name'].append(name) data['age'].append(age) data['phone'].append(phone) data['dept'].append(dept) data['enrolled_date'].append(enrolled_date) #print_log(data) return data STAFF_DATA = load_db(DB_FILE) #程序启动就执行 def op_gt(column,condtion_val): ''' :param column: eg.age :param condtion_val: eg.22 :return: [id,name,age,phone,...] ''' matched_records = [] for index,val in enumerate(STAFF_DATA[column]): #age [22,23,24] if float(val) > float(condtion_val): #匹配成功 #print("match",val) record = [] for col in COLUMNS: record.append(STAFF_DATA[col][index]) matched_records.append(record) #print("matched_records:",matched_records) return matched_records def op_lt(column,condtion_val): matched_records = [] for index,val in enumerate(STAFF_DATA[column]): #age [22,23,24] if float(val) < float(condtion_val): #匹配成功 #print("match",val) record = [] for col in COLUMNS: record.append(STAFF_DATA[col][index]) matched_records.append(record) #print("matched_records:",matched_records) return matched_records def op_eq(column,condtion_val): matched_records = [] for index,val in enumerate(STAFF_DATA[column]): #age [22,23,24] if val == condtion_val: #匹配成功 #print("match",val) record = [] for col in COLUMNS: record.append(STAFF_DATA[col][index]) matched_records.append(record) #print("matched_records:",matched_records) return matched_records def op_like(column,condtion_val): matched_records = [] for index,val in enumerate(STAFF_DATA[column]): #age [22,23,24] if condtion_val in val: #匹配成功 #print("match",val) record = [] for col in COLUMNS: record.append(STAFF_DATA[col][index]) matched_records.append(record) #print("matched_records:",matched_records) return matched_records def syntax_where(clause): ''' #解析where 条件,并且过滤 :param clause: age>22 :return: ''' operators = { '>':op_gt, '<':op_lt, '=':op_eq, 'like':op_like, } for op_key,op_func in operators.items(): if op_key in clause: print("clasuse:",clause) column,val = clause.split(op_key) matched_data = op_func(column.strip(),val.strip())#真正的查询数据 print(matched_data) return matched_data else:#只有for执行完成,并且中间没有被break才执行else #没匹配上任何的条件公式 print_log("语法错误:where条件只能支持[>|<|=|like]",'error') def syntax_find(data_set,query_clause): pass def syntax_delete(data_set, query_clause): pass def syntax_update(data_set, query_clause): pass def syntax_add(data_set, query_clause): pass def syntax_parser(cmd): ''' 解析语句,并执行 1. :param cmd: :return: ''' syntax_list = { 'find':syntax_find, 'del': syntax_delete, 'update': syntax_update, 'add': syntax_add, } if cmd.split()[0] in ('find','add','del','update'): query_clause,where_clause = cmd.split("where") print(query_clause,where_clause) matched_records = syntax_where(where_clause) cmd_action = query_clause.split()[0] if cmd_action in syntax_list: syntax_list[cmd_action](matched_records,query_clause) else: print_log("语法错误:[find|add|del|update][column,...] from [staff_table][where][column][><...][condtion]","error") def main(): ''' 让用户输入,并执行 :return: ''' while True: cmd = input("[staff_db:]").strip() if not cmd: continue syntax_parser(cmd) main()