模拟MySQL命令
staff_table
1,Alex Li,22,13651054608,IT,2013-04-01
2,Jack Wang,30,13304320533,HR,2015-05-03
3,Rain Liu,25,1383235322,Saies,2016-04-22
4,Mmck Cao,40,1356145343,HR,2009-03-01
+---------------------------------------READ ME-------------------------------------------------+
| 注:命令及关键字请使用小写
| 本代码为模拟简单的 MySQL 增删改查的功能,可参考给的例子,自行输入
+-----------------------------------------------------------------------------------------------+
| * 的位置表示显示范围,也可以输入表头名字,只打印这几列
| 范围 的位置,表示查找(修改)的条件,可以用and连接多个参数
| (field1,field2) 表示你增加时需要写入的列的名字, phone 必选
| values(value1,value2) 表示你增加时需要写入的列的数值
+-----------------------------------------------------------------------------------------------+
| 查找:select * from staff_table where 范围
| :select * from staff_table where age > 22 and dept = "HR" and enroll_date like ""
| :select name,age from staff_table where age > 22
+-----------------------------------------------------------------------------------------------+
| 插入:insert into staff_table (field1,field2) values(value1,value2)
| :insert into staff_table (name,age,phone,dept) values ('jia',22,15246512541,'IT')
+-----------------------------------------------------------------------------------------------+
| 删除:delete from staff_table where 范围
| :delete from staff_table where staff_id = 3
+-----------------------------------------------------------------------------------------------+
| 更新:update staff_table set field1=value1 where 范围
| :update staff_table set age = 23 where staff_id = 1
+-----------------------------------------------------------------------------------------------+
退出:q 再看一遍说明:r
low_B的代码
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Always"
# Date: 2017/6/16
import time file_path = r'staff_table'
readme_path = r'readme.txt'
all_tittle = ['staff_id', 'name', 'age','phone', 'dept', 'enroll_date']
func_dic = {} def add_func_dic(keys):
def deco(func):
func_dic[keys] = func
return deco def resolve_cmd(cmd):
"""
分解命令
这个函数,主要是用来处理接收的 select 命令,将各个参数提取出来,放到一个字典中
:param cmd: 这个参数是用户输入的,命令,格式为字符串形式
:return:
"""
cmd_dict = {'show_tittle':None, 'file_name':None, 'select_condetion':None, 'cmd':None}
cmd_deal = cmd.split('from')[0].split()
cmd_dict['cmd'] = cmd_deal.pop(0).strip()
cmd_deal = ''.join(cmd_deal).split(',')
cmd_dict['show_tittle'] = all_tittle if cmd_deal[0].strip() == "*" else cmd_deal
filename_select = cmd.split('from')[1].strip().split('where')
cmd_dict['file_name'] = filename_select[0].strip()
if len(filename_select) > 1:
cmd_dict['select_condetion'] = filename_select[1].strip()
return cmd_dict def deal_select_condetion(select_condetion):
"""
主要用来处理后面的条件有 like 的情况,为筛选的条件重新排序
:param select_condetion:
:return:
"""
select_condetion = select_condetion.split('and')
for i in range(len(select_condetion)):
if 'like' in select_condetion[i]:
select_condetion[i] = select_condetion[i].split()
select_condetion[i].reverse()
select_condetion[i] = ' '.join(select_condetion[i])
return ' and '.join(select_condetion).replace('like', 'in') def return_select_result(total_count, all_tittle, show_tittle, d):
"""
这个函数主要用来处理打印满足条件的行数和列数
:param total_count: 用来计算一共打印了多少行
:param all_tittle: 所有的表头,用来固定打印顺序
:param show_tittle: 代表需要打印的列
:return: 用来计算一共打印了多少行
"""
for tittle in all_tittle:
if tittle in show_tittle:
print('%-14s' % d[tittle], end='')
print()
total_count += 1
return total_count @add_func_dic('select')
def what_a_funck(cmd):
cmd_dict = resolve_cmd(cmd)
select(cmd_dict['file_name'], cmd_dict['select_condetion'], cmd_dict['show_tittle']) def select(file_name, select_condetion, show_tittle):
"""
这个功能用来查找,并打印符合要求的字段
:param file_name
:param select_condetion
:param show_tittle
:return:
"""
file_info_list = get_file_info_to_list(file_name) for tittle in all_tittle: # 打印表头
if tittle in show_tittle:
print('\033[44;1m%-14s' % tittle, end='')
print('\033[0m')
total_count = 0 if select_condetion: # 如果有筛选条件的话,按条件打印,没有的话,全部打印
select_condetion = select_condetion.replace('=', '==') # 如果判断条件有一个 ’=‘ 就把他变成两个,方便后面 eval 计算
if 'like' in select_condetion: # 如果判断条件有 like 就把 enroll_date like "2013" 改成 “2013” in enroll_date ,方便后面 eval 计算
select_condetion = deal_select_condetion(select_condetion) for d in file_info_list: # 遍历 用户信息 列表
globals().update(d) # 将字典中所有内容变为变量,用来处理条件
show_table_tittle = False
if eval(select_condetion): # 如果满足输入的条件,那么打印信息 total_count = return_select_result(total_count,all_tittle,show_tittle, d)
else: # 如果用户没有输入筛选条件,执行这里
for d in file_info_list:
total_count = return_select_result(total_count, all_tittle, show_tittle, d)
print('\033[1mtotal count: %s\033[0m'%total_count) def get_file_info_to_list(file_path): # 将文件内容取出来,放入 [{},{}] 中
with open (file_path,encoding='utf-8') as f:
return [{'staff_id':int(line.strip().split(',')[0]), 'name':line.strip().split(',')[1], 'age':int(line.strip().split(',')[2]), 'phone':line.strip().split(',')[3], 'dept':line.strip().split(',')[4], 'enroll_date':line.strip().split(',')[5]} for line in f] def insert_split(cmd): # 插入功能的前戏
"""
插入功能的命令分解。。。
:param cmd: 用户输入的命令
:return: 包含分解的命令的字典
"""
cmd_dict = {}
cmd_split = cmd.split()
if cmd_split[1] != 'into':
return
cmd_dict['file_name'] = cmd_split[2]
cmd_split = ''.join(cmd_split[3:]).split('values')
cmd_dict['keys'] = cmd_split[0].strip('(').strip(')').split(',')
cmd_dict['values'] = cmd_split[1].strip('(').strip(')').split(',')
return cmd_dict @add_func_dic('insert')
def insert(cmd, all_tittle = all_tittle, file_path = file_path): # 插入功能的开始
"""
插入功能,新增一个用户
:param cmd: 传入命令行的输入,进行分解调用
:param all_tittle: 默认为全局变量,用来判断需要写入那些内容,以及位置排序
:param file_path: 默认为全局变量,用来标记需要修改的文件名
:return:
"""
if not insert_split(cmd):
print('输入错误。。。')
return
cmd_dict = insert_split(cmd)
globals().update(cmd_dict)
file_info_list = get_file_info_to_list(file_path)
new_people_info = {'staff_id':file_info_list[-1]['staff_id'] + 1}
if 'phone' not in keys:
print('哥,我也不想的,老师指定 phone 为唯一键,不输入不行啊。。。。')
return for i in file_info_list: # 如果号码重复,重新输入
if i['phone'] == values[keys.index('phone')]:
print('那啥,号码已注册,换一个吧。。亲。。。。')
return
if 'age' in keys and not values[keys.index('age')].isdigit(): # 判断年龄是不是数字
print('年龄需要为数字。。。')
return for i in all_tittle[1:]: # 准备加入 新人物 的信息
if i in keys:
new_people_info[i] = values[keys.index(i)].strip("'").strip('"')
else:
new_people_info[i] = None
new_people_info = [new_people_info]
add_new_people(all_tittle, new_people_info, file_path, open_with='a')
print('\033[1m加入成功。。。\033[0m') def add_new_people(all_tittle,new_people_info, file_path, open_with = 'r'):
"""
主要用来写入或增加 staff_table 的内容
:param all_tittle: 存放表头信息
:param new_people_info: 需要加入,或重新写入的任务信息
:param file_path: 文件路径
:param open_with: 打开方式
:return: 1
"""
with open(file_path, open_with, encoding='utf-8') as f:
new_people_info_str = ''
if new_people_info[0]['enroll_date'] == None:
new_people_info[0]['enroll_date'] = time.strftime("%Y-%m-%d") for d in new_people_info:
for i in all_tittle:
new_people_info_str += '%s,'%d[i]
new_people_info_str = new_people_info_str.strip(',') + '\n'
f.write(new_people_info_str)
return 1 @add_func_dic('delete')
def delete(cmd1):
"""
处理删除命令,通过匹配符合条件的方法,不符合的加入新的列表中,等待重新写入
:param cmd1: 用户输入的命令
:return: 1
"""
cmd_dic = resolve_cmd(cmd1)
cmd, file_name, select_condetion = cmd_dic['cmd'], cmd_dic['file_name'], cmd_dic['select_condetion'] if select_condetion:
select_condetion = select_condetion.replace('=', '==')
if 'like' in select_condetion: # 如果判断条件有 like 就把 enroll_date like "2013" 改成 “2013” in enroll_date ,方便后面 eval 计算
select_condetion = deal_select_condetion(select_condetion)
else:
print("请输入条件。。。。")
return file_info_list = get_file_info_to_list(file_name) # 获取文件相关参数
new_file_list = [] # 筛选出新信息后重新写入
total_count = 0
for d in file_info_list:
globals().update(d)
if not eval(select_condetion):
new_file_list.append(d)
else:
total_count += 1
add_new_people(all_tittle,new_file_list,file_name,open_with='w')
print('\033[1m删除了%s条内容。。。\033[0m' % total_count)
return 1 def update_split(cmd):
"""
处理用户更新信息时候的命令,将它分割开
:param cmd: 用户输入的信息
:return: 分割好的内容 file_name, change_thing, select_condetion
"""
cmd_dic={}
cmd_dic['file_name'] = cmd.split('set')[0].split('update')[1].strip()
cmd_dic['change_thing'] = cmd.split('where')[0].split('set')[1].strip().split('=')
if 'staff_id' in cmd_dic['change_thing'][1]:
print('哥,为了方便程序运行,我禁止了修改 ID 。。。。')
return
if 'where' not in cmd:
print('没有输入范围(where)。。。')
return
cmd_dic['select_condetion'] = cmd.split('where')[1].strip()
if 'age' in cmd_dic['change_thing']:
if not cmd_dic['change_thing'][1].isdigit():
print('年龄要是个数字。。。。')
return
return cmd_dic['file_name'], cmd_dic['change_thing'], cmd_dic['select_condetion'] @add_func_dic('update')
def update(cmd):
"""
这个程序用来修改数据库信息
:param cmd: 用户输入的命令
:return: 1
"""
cmd_dic = update_split(cmd)
if not cmd_dic:
return
file_name, change_thing, select_condetion = update_split(cmd)
select_condetion = select_condetion.replace('=','==')
if 'like' in select_condetion: # 如果判断条件有 like 就把 enroll_date like "2013" 改成 “2013” in enroll_date ,方便后面 eval 计算
select_condetion = deal_select_condetion(select_condetion)
file_info_list = get_file_info_to_list(file_name)
total_count = 0
for i,d in enumerate(file_info_list):
globals().update(d)
if eval(select_condetion):
file_info_list[i][change_thing[0].strip()] = change_thing[1].strip()
total_count += 1 add_new_people(all_tittle,file_info_list, file_name, open_with = 'w')
print('\033[1m修改了%s条内容。。。\033[0m' % total_count) def main():
while True:
with open(readme_path,encoding='utf-8') as f:
for i in f:
print(i.strip())
while True:
cmd = input("\033[31;1m>>>\033[0m").strip()
if cmd.upper() == 'Q':
exit('谢谢使用')
elif cmd.upper() == 'R':
break
try:
func_dic[cmd.strip().split()[0]](cmd)
except Exception:
print('输入错误。。。')
time.sleep(0.3) if __name__ == "__main__":
main()
仿MySQL
模拟MySQL命令的更多相关文章
- 转 【MySQL】常用拼接语句 shell 下执行mysql 命令
[MySQL]常用拼接语句 前言:在MySQL中 CONCAT ()函数用于将多个字符串连接成一个字符串,利用此函数我们可以将原来一步无法得到的sql拼接出来,在工作中也许会方便很多,下面主要介绍下几 ...
- Mysql命令大全
格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输 ...
- ****Linux MySQL命令运用个人总结
1.xampp在linux下如何使用mysql命令 A: 解决方法(推荐第二个方法): 1.xampp中的命令工具在/opt/lampp/bin/目录中,所以可以这样运行mysql命令 /opt/la ...
- MySQL命令行登录的例子
环境:MySQL Sever 5.1 + MySQL命令行工具 问题:MySQL命令行登录 解决: 命令 行登录语法: mysql –u用户名 [–h主机名或者IP地址] –p密码 说明:用户名是你登 ...
- MySQL命令行下执行.sql脚本详解
本文主要介绍一个在MySQL命令行下执行脚本文件的例子,通过这个例子让我们来了解一下在命令行下MySQL是怎样执行脚本的吧.现在我们开始介绍这一过程. 1.首先编写sql脚本,保存为的:book.sq ...
- Mysql 命令大全
1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root - ...
- mysql 在windows下,使用 net start mysql 命令发生错误 服务名无效 或 1067
mysql 在windows下,使用 net start mysql 命令发生错误 :服务名无效 或 1067 先使用mysqld -install安装一下 删除data目录下的日志等文件(因为之前 ...
- MySQL命令大全:MySQL常用命令手册、MySQL命令行大全、查询工具
1.连接Mysql 格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root ...
- MYSQL命令行使用指南
一.连接MYSQL. 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -u ...
随机推荐
- Switch控制器
比如目前有qq和百度两个网站,switch可以指定选择一个 Switch value是填写索引值,从0开始.也可以书去请求的名词比如,qq或者百度 填写0就是访问qq 填写1就是访问百度
- 一起感受HTML5和CSS3
Web设计师可以使用HTML4和CSS2.1完成一些很酷的东西.我们可以在不使用陈旧的基于table布局的基础上完成文档逻辑结构并创建内容丰富的网站.我们可以在不使用内联<font>和&l ...
- Flatty Shadow图标自动产生器——在线生成各种扁平化 ICON
在扁平化风格越来越流行的今天,网页.软件界面和图标的设计大都采用了扁平化风格.特别是扁平化图标的设计,摒弃了一切3D元素的设计,阴影.纹理.透视神马的统统不要,让图标简洁高效,富有现代感. 今天给大家 ...
- Linux操作系统 和 Windows操作系统 的区别
针对这两个操作系统,下面是几点区别. 1.免费与收费 在中国, windows 和 linux 都是免费的,至少对个人用户是如此,如果哪天国内windows真的严打盗版了,那linux的春天就到了!但 ...
- 覆盖element ui 的样式
我们可以使用 !important 来覆盖element ui 的样式 首先先在浏览器中找到 我们所要修改的样式 ,然后找到她的 class 重新写他的样式 ,例如 . app { width ...
- leetcode-399-除法求值
方法一:dfs+图 class Solution: def calcEquation(self, equations: List[List[str]], values: List[float], qu ...
- Spring - <bean parent="xxx" 属性>
总结 必要条件: 1.子bean必须与父bean保持兼容,也就是说子bean中必须有父bean定义的所有属性. 2.父bean必须是抽象bean或者定义lazy-init=true也就是不让bean工 ...
- 【集合!】 20140416 && 20140417集训 总结
mobius的奇怪演绎 当我第一眼看见题目中出现mobius的时候,我唯一想到的就是某科学家对于n维空间的阐述与思考,同时还提出了一个mobius环.而这道题中的环就是mobius环咯.不过其实这是一 ...
- 排列+函数映射——hdu6038好题
/* 引理:[0,n-1]的排列,i向a[i]连边,那么每个数必定在一个环中 所以数组a可以分割成一些环,数组b也可以分割成一些环 先讨论a的一个环 a[a1]=a2 a[a2]=a3 a[a3]=a ...
- docker快速安装kibana
一.拉取镜像 docker pull kibana:5.6.9 二.启动容器 docker run --name kibana -e ELASTICSEARCH_URL=http://10.0.0.1 ...