Python编程 模拟SQL语句 实现对员工信息的增删改查

简介: 使用python实现员工系统并且具有员工信息增删改查等基础功能

一、问题描述


用 Python 模拟 sql 语句,实现对员工信息的增删改查。


  • 封装函数,传入参数:文件路径和 sql 命令。
  • 模拟 sql 语句实现对员工信息的现增删改查,并打印结果。


二、Python编程


导入需要的依赖库


# -*- coding: UTF-8 -*-"""@Author   :叶庭云@file     :实训第二次作业@function :封装函数  根据输入的文件路径和sql命令            模拟sql语句实现对员工信息的现增删改查"""importreimportos


函数式编程


defsql_parse(sql_, key_list):
"""    解析sql命令字符串,按照key_lis列表里的元素分割sql得到字典形式的命令sql_dic    :param sql_:    :param key_list:    :return:    """sql_list= []
sql_dic= {}
foriinkey_list:
b= [j.strip() forjinsql_.split(i)]
iflen(b) >1:
iflen(sql_.split('limit')) >1:
sql_dic['limit'] =sql_.split('limit')[-1]
ifi=='where'ori=='values':
sql_dic[i] =b[-1]
ifsql_list:
sql_dic[sql_list[-1]] =b[0]
sql_list.append(i)
sql_=b[-1]
else:
sql_=b[0]
ifsql_dic.get('select'):
ifnotsql_dic.get('from') andnotsql_dic.get('where'):
sql_dic['from'] =b[-1]
ifsql_dic.get('select'):
sql_dic['select'] =sql_dic.get('select').split(',')
ifsql_dic.get('where'):
sql_dic['where'] =where_parse(sql_dic.get('where'))
returnsql_dicdefwhere_parse(where):
"""    格式化where字符串为列表where_list,用'and', 'or', 'not'分割字符串    :param where:    :return:    """casual_l= [where]
logic_key= ['and', 'or', 'not']
forjinlogic_key:
foriincasual_l:
ifinotinlogic_key:
iflen(i.split(j)) >1:
ele=i.split(j)
index=casual_l.index(i)
casual_l.pop(index)
casual_l.insert(index, ele[0])
casual_l.insert(index+1, j)
casual_l.insert(index+2, ele[1])
casual_l= [kforkincasual_lifk]
where_list=three_parse(casual_l, logic_key)
returnwhere_listdefthree_parse(casual_l, logic_key):
"""    处理临时列表casual_l中具体的条件,'staff_id>5'-->['staff_id','>','5']    :param casual_l:    :param logic_key:    :return:    """where_list= []
foriincasual_l:
ifinotinlogic_key:
b=i.split('like')
iflen(b) >1:
b.insert(1, 'like')
where_list.append(b)
else:
key= ['<', '=', '>']
new_lis= []
opt=''lis= [jforjinre.split('([=<>])', i) ifj]
forkinlis:
ifkinkey:
opt+=kelse:
new_lis.append(k)
new_lis.insert(1, opt)
where_list.append(new_lis)
else:
where_list.append(i)
returnwhere_listdefsql_action(sql_dic, titles):
"""    把解析好的sql_dic分发给相应函数执行处理    :param sql_dic:    :param titles:    :return:    """key= {'select': select,
'insert': insert,
'delete': delete,
'update': update}
res= []
foriinsql_dic:
ifiinkey:
res=key[i](sql_dic, titles)
returnresdefselect(sql_dic, title_):
"""    处理select语句命令    :param sql_dic:    :param title_:    :return:    """withopen(data_path, 'r', encoding='utf-8') asfh:
filter_res=where_action(fh, sql_dic.get('where'), title_)
limit_res=limit_action(filter_res, sql_dic.get('limit'))
search_res=search_action(limit_res, sql_dic.get('select'), title_)
returnsearch_resdefinsert(sql_dic):
"""    处理insert语句命令    :param sql_dic:    :return:    """withopen(data_path, 'r+', encoding='utf-8') asfp:
data_=fp.readlines()
phone_list= [i.strip().split(',')[4] foriindata_]
ins_count=0ifnotdata_:
new_id=1else:
last=data_[-1]
last_id=int(last.split(',')[0])
new_id=last_id+1record=sql_dic.get('values').split('/')
foriinrecord:
ifi.split(',')[2] inphone_list:
print('\033[1;31m%s 手机号已存在\033[0m'%i)
else:
new_record='\n%s,%s\n'% (str(new_id), i)
fp.write(new_record)
new_id+=1ins_count+=1fp.flush()  # 刷新记录return ['insert successfully!'], [str(ins_count)]
defdelete(sql_dic, item):
"""    处理delete语句命令    :param sql_dic:    :param item:    :return:    """withopen(data_path, 'r', encoding='utf-8') asr_file, \
open('staff_data_bak.txt', 'w', encoding='utf-8') asw_file:
del_count=0# delete from staff_data.txt where staff_id>=5 and staff_id<=10forlineinr_file.read().split("\n")[1:]:
# print(line)dic=dict(zip(item.split(','), line.split(',')))
# print(dic)# delete from staff_data.txt where staff_id>=5 and staff_id<=10print(dic)
print(sql_dic.get("where"))
# exp_1, opt, exp_2 = sql_dic.get("where")record_list= []
try:
foriteminsql_dic.get("where"):
print(item)
iftype(item) islist:
exp_1, opt, exp_2=itemprint(exp_1, opt, exp_2)
flag=eval(f'{dic["staff_id"]}{opt}{exp_2}')
print(flag)
record_list.append(flag)
print(all(record_list), record_list)
ifall(record_list):  # 删除满足条件的del_count+=1passelse:
w_file.write(line+"\n")
exceptExceptionase:
print(e.args[0])
passw_file.flush()
# os.remove('staff_data.txt')# os.rename('staff_data_bak.txt', 'staff_data.txt')return ['delete successfully!'], [str(del_count)]
defupdate(sql_dic, title_):
"""    处理update语句命令    :param sql_dic:    :param title_:    :return:    """set_l=sql_dic.get('set').strip().split(',')
set_list= [i.split('=') foriinset_l]
update_count=0withopen(data_path, 'r', encoding='utf-8') asr_file, \
open('staff_data_bak.txt', 'w', encoding='utf-8') asw_file:
forlineinr_file:
dic=dict(zip(title_.split(','), line.strip().split(',')))
filter_res=logic_action(dic, sql_dic.get('where'))
iffilter_res:
foriinset_list:
k=i[0]
v=i[-1]
dic[k] =vline= [dic[i] foriintitle_.split(',')]
update_count+=1line=','.join(line) +'\n'w_file.write(line)
w_file.flush()
os.remove('staff_data.txt')
os.rename('staff_data_bak.txt', 'staff_data.txt')
return ['update successfully!'], [str(update_count)]
defwhere_action(fh, where_list, title_):
"""    具体处理where_list里的所有条件    :param fh:    :param where_list:    :param title_:    :return:    """res= []
iflen(where_list) !=0:
forlineinfh:
dic=dict(zip(title_.split(','), line.strip().split(',')))
ifdic['name'] !='name':
logic_res=logic_action(dic, where_list)
iflogic_res:
res.append(line.strip().split(','))
else:
res= [i.split(',') foriinfh.readlines()]
returnresdeflogic_action(dic, where_list):
"""    判断数据文件中每一条是否符合where_list条件    :param dic:    :param where_list:    :return:    """logic= []
# print(where_list)# print(dic)forexpinwhere_list:
# print(exp)iftype(exp) islist:
exp_k, opt, exp_v=exp# print(exp_k, opt, exp_v)ifexp[1] =='=':
opt='=='logical_char="'%s'%s'%s'"% (dic[exp_k], opt, exp_v)
# print(logical_char)ifopt!='like':
exp=str(eval(logical_char))
else:
ifexp_vindic[exp_k]:
exp='True'else:
exp='False'logic.append(exp)
res=eval(' '.join(logic))
returnresdeflimit_action(filter_res, limit_l):
"""    用列表切分处理显示符合条件的数量    :param filter_res:    :param limit_l:    :return:    """iflimit_l:
index=int(limit_l[0])
res=filter_res[:index]
else:
res=filter_resreturnresdefsearch_action(limit_res, select_list, title_):
"""    处理需要查询并显示的title和相应数据    :param limit_res:    :param select_list:    :param title_:    :return:    """res= []
fields_list_=title_.split(',')
ifselect_list[0] =='*':
res=limit_reselse:
fields_list_=select_listfordata_inlimit_res:
dic=dict(zip(title_.split(','), data_))
r_l= []
foriinfields_list_:
r_l.append((dic[i].strip()))
res.append(r_l)
returnfields_list_, res


主函数调用


if__name__=='__main__':
# 指令关键词列表key_lis= ['select', 'insert', 'delete', 'update', 'from', 'into', 'set', 'values', 'where', 'limit']
whileTrue:
sql=input('请输入sql命令,退出请输入exit->>>').strip()
sql=re.sub(' ', '', sql)
iflen(sql) ==0:
continueifsql=='exit':
breaksql_dict=sql_parse(sql, key_lis)
try:
data_path=sql_dict['from']
exceptKeyError:
data_path=sql_dict['into']
withopen(data_path, 'r', encoding='utf-8') asf:
title=f.readline().strip()
fields_list, fields_data=sql_action(sql_dict, title)
print('\033[0;32m结果如下:\033[0m')
print('-'.join(fields_list))
fordatainfields_data:
print('-'.join(data))


三、测试结果


# 测试sql命令如下:# select * from staff_data.txt where dept=人事# select name,age from staff_data.txt where age > 27# select * from staff_data.txt where enroll_date like 2017# insert into staff_data.txt values 叶庭云,21,13198497869,算法,2018-7-12# update into staff_data.txt set dept=算法,phone=13566677787 where staff_id=8# delete from staff_data.txt where staff_id>=5 and staff_id<=10# delete from staff_data.txt where staff_id>=5 and staff_id<=10




所有测试结果如下:



推荐阅读:

https://www.cnblogs.com/JayeHe/p/6846524.html

https://www.jb51.net/article/117919.htm

目录
相关文章
|
28天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
16天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
102 80
|
5天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
27 14
|
25天前
|
SQL 存储 数据挖掘
使用Python和PDFPlumber进行简历筛选:以SQL技能为例
本文介绍了一种使用Python和`pdfplumber`库自动筛选简历的方法,特别是针对包含“SQL”技能的简历。通过环境准备、代码解析等步骤,实现从指定文件夹中筛选出含有“SQL”关键词的简历,并将其移动到新的文件夹中,提高招聘效率。
45 8
使用Python和PDFPlumber进行简历筛选:以SQL技能为例
|
15天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
51 2
|
28天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
46 10
|
28天前
|
人工智能 数据挖掘 开发者
探索Python编程之美:从基础到进阶
本文是一篇深入浅出的Python编程指南,旨在帮助初学者理解Python编程的核心概念,并引导他们逐步掌握更高级的技术。文章不仅涵盖了Python的基础语法,还深入探讨了面向对象编程、函数式编程等高级主题。通过丰富的代码示例和实践项目,读者将能够巩固所学知识,提升编程技能。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起踏上Python编程的美妙旅程吧!
|
SQL 关系型数据库 Python
|
4月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
6月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
140 13