python学习day5

# _*_ coding:utf-8 _*_

"""
模拟数据库:
表内容:
1,Alex,22,13651054608,IT
2,Egon,23,13304320533,Tearcher
3,ding,23,18311028091,IT
表结构:
KEYS = ["id", "name", "age", "phone", "job"]
只有一个信息表,表名:table
增,语法:add from table ding,23,18311028091,IT
删,语法:del from table where id=3
改,语法:update table set age = 23 where name=ding
查,语法:select from table where age=22
select * from table where age=22
select * from table

"""

import os
db_file = "table"
KEYS = ["id", "name", "age", "phone", "job"]


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):
"""
加载员工信息表,加载成字典格式
:param db_file:
:return:
"""
info = {}
for i in KEYS:
info[i] = []
with open(db_file, encoding="utf-8") as f:
for line in f:
cust_id, name, age, phone, job = line.split(",")
info["id"].append(cust_id)
info["name"].append(name)
info["age"].append(age)
info["phone"].append(phone)
info["job"].append(job)
return info


DATA = load_db(db_file)



def method_gt(column, condtion_val):
"""
">"方法
:param column:listing
:param val:值
:return:
"""
user_info = []
for index,val in enumerate(DATA[column]):
if float(val) > float(condtion_val):
record = []
for col in KEYS:
record.append(DATA[col][index])
user_info.append(record)
return user_info




def method_lt(column, condtion_val):
"""
"<"方法
:param column:
:param condtion_val:
:return:
"""
user_info = []
for index,val in enumerate(DATA[column]):
if float(val) < float(condtion_val):
record = []
for col in KEYS:
record.append(DATA[col][index])
user_info.append(record)
return user_info

def method_eq(column, condtion_val):
"""
"="方法
:param column:
:param condtion_val:
:return:
"""
user_info = []
for index,val in enumerate(DATA[column]):
if val == condtion_val:
record = []
for col in KEYS:
record.append(DATA[col][index])
user_info.append(record)
return user_info

def method_like(column, condtion_val):
"""
"like"方法
:param column:
:param condtion_val:
:return:
"""
user_info = []
for index,val in enumerate(DATA[column]):
if condtion_val in val:
record = []
for col in KEYS:
record.append(DATA[col][index])
user_info.append(record)
return user_info

def way_where(clause):
"""
解析where条件,并过滤数据
:param clause:
:return:
"""
method = {
">": method_gt,
"<": method_lt,
"=": method_eq,
"like": method_like
}
for method_key, method_func in method.items():
if method_key in clause:
column, val = clause.split(method_key)
user_data = method_func(column.strip(), val.strip())
return user_data
else:
print_log("语法错误:where条件只支持[>,<,=,like]", "error")


def sql_parser(choise):
"""
解析sql语句
:param choise:
:return:
"""
way_list = {
"select":way_select,
"add":way_add,
"update":way_update
}
if choise.split()[0] in ("add", "del", "update", "select"):
if "where" in choise:
query_clause, where_clause = choise.split("where")
way_where(where_clause)
user_data = way_where(where_clause)
else:
user_data = []
for index,cust_id in enumerate(DATA["id"]):
data = []
for col in KEYS:
data.append(DATA[col][index])
user_data.append(data)
query_clause = choise
choise_action = choise.split()[0]
if choise_action in way_list:
way_list[choise_action](user_data,query_clause)
elif choise.split()[0] == "del":
way_delete(user_data,choise)
else:
print_log(
"语法错误:[add\\del\\update\\select] from [table] [where] [listing] [>,<,=,like] [val]\n",
"error")


def way_add(date_set,query_clause):
"""
对员工信息表添加数据
语法:add from table ding,23,18311028091,IT
:param date_set:
:param query_clause:
:return:
"""


choise_way = query_clause.split("from")[0].strip()
choise_val = query_clause.split(db_file)[1].strip()
if choise_way == "add" and len(choise_val) > 1:
with open(db_file,encoding="utf-8",mode="a") as f1:
choise_id = id + 1
choise_id_1 = str(choise_id)
f1.write(choise_id_1)
f1.write(",")
f1.write(choise_val)
f1.close()
print("添加%s成功!"% choise_val)




def way_select(data_set,query_clause):
"""
解析查询语句并从data_set打印指定的列
语法:select from table where age=22
select * from table where age=22
select * from table
:param date_set:
:param query_clause:
:return:
"""
columns = query_clause.split("from")[0][6:].split(",")
cols = [i.strip() for i in columns]
if '*' in cols[0]:
print(data_set)
else:
format_data_set = []
for listing in data_set:
col_vals = [] #把要打印的字段放在这个列表里
for col in cols:
col_index = KEYS.index(col) #拿到每条记录的索引和对应的值
col_vals.append( listing[col_index] )
format_data_set.append(col_vals)
for i in format_data_set:
print(i)

def read():
with open(db_file, encoding="utf-8", mode="r") as f:
lines = f.readlines()
last_line = lines[-1]
last_id = last_line[0]
last_id_1 = int(last_id)
f.close()
return last_id_1
id = read()
def way_delete(data_set,choise):
"""
根据"id"号删除整行数据
del from table where id=3
:param date_set:
:param query_clause:
:return:
"""
columns = choise.split("where")[1].split("=")[1]
columns_id = int(columns)
if columns in DATA["id"]:
with open(db_file,encoding="utf-8",mode="r") as f:
user_info = []
for i in f:
r = i.strip().split("\n")
user_info.append(r)
user_info.pop(columns_id-1)
f.close()
with open("%s.new" % db_file, encoding="utf-8", mode="w") as f1:
for w in user_info:
str = ",".join(w)
f1.write(str+"\n")
f1.close()
os.remove(db_file)
os.rename("%s.new" % db_file, db_file)
print("删除数据成功!")



else:
print_log("输入有误!","error")



#with open(db_file,encoding="utf-8",mode="w") as f:






def way_update(data_set,query_clause):
"""
语法:update table set age = 23 where name=ding
:param date_set:
:param query_clause:
:return:
"""
update_info = query_clause.split("set")
if len(update_info) > 1:
col_name,new_val = update_info[1].strip().split("=")
for matched_row in data_set:
cust_id = matched_row[0]
cust_id_index = DATA["id"].index(cust_id)
DATA[col_name][cust_id_index] = new_val
save_db()
print("update" " " +col_name+ "=" +new_val+ " ""数据成功!")


else:
print_log("语法错误:未检测到set关键字!","error")


def save_db():
"""
把修改 在内存中的数据存到硬盘
:return:
"""
with open("%s.new"%db_file,encoding="utf-8",mode="w") as f1:
for index,cust_id in enumerate(DATA["id"]):
row = []
for col in KEYS:
row.append( DATA[col][index])
f1.write(",".join(row))
f1.close()
os.remove(db_file)
os.rename("%s.new"% db_file,db_file)


def main():
"""
次函数是用户输入sql语句,调用sql语句方法。
:return:
"""
while True:
choise = input("SQL:").strip()
if not choise:
print("输入不能为空,请重新输入。")
continue
sql_parser(choise.strip())


main()


猜你喜欢

转载自www.cnblogs.com/dingyang-python/p/9155141.html