Python 模拟员工信息数据库操作的实例


Posted in Python onOctober 23, 2017

1.功能简介

此程序模拟员工信息数据库操作,按照语法输入指令即能实现员工信息的增、删、改、查功能。

2.实现方法

• 架构:

本程序采用python语言编写,关键在于指令的解析和执行:其中指令解析主要运用了正则表达式来高效匹配有效信息;指令执行通过一个commd_exe主执行函数和增、删、改、查4个子执行函数来实现,操作方法主要是运用面向对象方法将员工信息对象化,从而使各项操作都能方便高效实现。程序主要函数如下:

(1)command_exe(command)

指令执行主函数,根据指令第一个字段识别何种操作,并分发给相应的处理函数执行。

(2)add(command)

增加员工记录函数,指令中需包含新增员工除id号以外的其他所有信息,程序执行后信息写入员工信息表最后一行,id号根据原最后一条记录的id号自增1。

(3)delete(command)

删除员工记录函数,可根据where后的条件检索需删除的记录,并从信息表中删除。

(4)update(command)

修改和更新员工记录函数,根据where后的条件检索需更新的记录,根据set后的等式修改和更新指定的信息。

(5)search(command)

查询员工记录函数,根据where后的条件查询到相应的记录,根据select后的关键字来显示记录的指定信息,如果为*显示记录的所有信息。

(6)verify(staff_temp,condition)

员工信息验证函数,传入一个对象化的员工记录和指令中where后的条件字符串,判断记录是否符合条件,符合在返回True,否则返回False。指令包含where字段的删、改、查操作会调用此函数。

(7)logic_cal(staff_temp,logic_exp)

单个逻辑表达式的运算函数,传入一个对象化的员工记录和从where条件字符串中被and、or、not分割的单个表达式,实现=,>,<,>=,<=,like等确定的一个逻辑表达式的运算,返回结果为True或False。

• 主要操作:

数据记录包含6个关键字:id,name,age,phone,dept,enroll_date

指令可用的逻辑运算符:<,>,=,<=,>=,like,and,or,not

数据库操作:

1.增(add to xxxx values xxxx)

示例:add to staff_table values Alex Li,22,13651054608,IT,2013-04-01

2.删(delete from xxxx where xxxx)

示例:delete from staff_table where age<=18 and enroll_date like "2017"

3.改(update xxxx set xxxx where xxxx)

示例:

update staff_table set dept="Market",age=30 where dept="IT" and phone like "189"

4.查(select xxxx from xxxx where xxxx)

示例1:

select * from staff_table where age>=25 and not phone like "136" or name like "李"

示例2:

select name,age,dept from db.txt where id<9 and enroll_date like "-05-"

示例3:select * from staff_table where * #显示所有记录

•使用文件:

staff_table

存放员工信息表,作为模拟的数据库文件,每条记录包含id,name,age,phone,dept,enroll_date六项信息,如"1,Alex Li,22,13651054608,IT,2013-04-0"。

3.流程图

Python 模拟员工信息数据库操作的实例

4.代码

#!usr/bin/env python3
#_*_coding:utf-8_*_

'staff infomation management module'
__author__='Byron Li'

'''----------------------------------------------员工信息数据库操作指令语法---------------------------------------------
数据记录包含6个关键字:id,name,age,phone,dept,enroll_date
指令可用的逻辑运算符:<,>,=,<=,>=,like,and,or,not
1.增(add to xxxx values xxxx)
 示例:add to staff_table values Alex Li,22,13651054608,IT,2013-04-01 
2.删(delete from xxxx where xxxx)
 示例:delete from staff_table where age<=18 and enroll_date like "2017"
3.改(update xxxx set xxxx where xxxx)
 示例:update staff_table set dept="Market",age=30 where dept="IT" and phone like "189"
4.查(select xxxx from xxxx where xxxx)
 示例1:select * from staff_table where age>=25 and not phone like "136" or name like "李"
 示例2:select name,age,dept from db.txt where id<9 and enroll_date like "-05-"
 示例3:select * from staff_table where *   #显示所有记录
---------------------------------------------------------------------------------------------------------------------'''
import re
import os
class staff(object):    #员工类
 def __init__(self,*args):  #员工信息初始化:从字符串列表传参赋值
  self.id=args[0]
  self.name=args[1]
  self.age=args[2]
  self.phone=args[3]
  self.dept=args[4]
  self.enroll_date=args[5]
  self.allinfo=','.join(args)
 def update(self,**kwargs):  #员工信息更新:从字典传参赋值
  if 'id' in kwargs:
   self.id=kwargs['id']
  if 'name' in kwargs:
   self.name=kwargs['name']
  if 'age' in kwargs:
   self.age = kwargs['age']
  if 'phone' in kwargs:
   self.phone=kwargs['phone']
  if 'dept' in kwargs:
   self.dept=kwargs['dept']
  if 'enroll_date' in kwargs:
   self.enroll_date = kwargs['enroll_date']
  self.allinfo = ','.join(map(str,[self.id, self.name, self.age, self.phone, self.dept, self.enroll_date]))
 def print_info(self,info):  #员工信息打印显示:传入的参数为"*"或数据记录的若干个关键字
  if info=='*':
   print(self.allinfo)
  else:
   info=info.split(',')
   res=[]
   for i in info:
    if hasattr(self,i.strip()):
     res.append(str(getattr(self,i.strip())))
   print(','.join(res))

def command_exe(command): #指令执行主函数,根据指令第一个字段识别何种操作,并分发给相应的处理函数执行
 command=command.strip()
 return {
  'add':add,
  'delete':delete,
  'update':update,
  'select':search,
 }.get(command.split()[0],error)(command)

def error(command):  #错误提示函数,指令不合语法调用该函数报错
 print('\033[31;1m语法错误,请重新输入!\033[0m\n')

def add(command):  #增加员工记录函数
 command_parse=re.search(r'add\s*?to\s(.*?)values\s(.*)',command) #正则表达式指令解析
 if(command_parse):
  data_file=command_parse.group(1).strip() #数据库文件
  info=command_parse.group(2).strip()  #需新增的员工信息,不含id
  id=1          #新增员工id,默认为1以防数据库为空表时新增记录id取1
  with open(data_file, 'r+', encoding='utf-8') as fr:
   line=fr.readline()
   while(line):
    if line.strip()=='':
     fr.seek(fr.tell()-len(line)-2) #定位文件最后一行(只有空字符)的开头
     break
    staff_temp = staff(*line.strip().split(','))  #读取的信息转换为staff对象
    id = int(staff_temp.id) + 1   #末行员工id加1为新员工id
    line = fr.readline()
   info_new=''.join([str(id),',',info]) #id与其他信息合并成完整记录
   fr.write(info_new)
   fr.write('\n')
   fr.flush()
   print("数据库本次\033[31;1m新增1条\033[0m员工信息:", info_new) #新增记录打印
 else:
  error(command)

def delete(command): #删除员工记录函数
 command_parse=re.search(r'delete\s*?from\s(.*?)where\s(.*)',command) #指令解析
 if(command_parse):
  data_file=command_parse.group(1).strip() #数据库文件
  condition=command_parse.group(2).strip() #检索条件
  data_file_bak = ''.join([data_file, '.bak'])
  count = 0   #删除记录计数
  staff_list = []  #删除记录的员工对象列表
  with open(data_file, 'r', encoding='utf-8') as fr, \
    open(data_file_bak, 'w', encoding='utf-8') as fw:
   for line in fr:
    staff_temp = staff(*line.strip().split(','))
    if (verify(staff_temp, condition)): #验证员工信息是否符合条件
     count+=1
     staff_list.append(staff_temp)
     continue
    fw.write(staff_temp.allinfo)
    fw.write('\n')
   fw.flush()
  os.remove(data_file)
  os.rename(data_file_bak, data_file)
  print("数据库本次共\033[31;1m删除%d条\033[0m员工信息,如下:"%count)
  for staff_temp in staff_list:
   staff_temp.print_info('*') #删除记录打印
 else:
  error(command)

def update(command):  #修改和更新员工记录函数
 command_parse=re.search(r'update\s(.*?)set\s(.*?)where\s(.*)',command) #指令解析
 if(command_parse):
  data_file=command_parse.group(1).strip()  #数据库文件
  info=command_parse.group(2).strip()   #需更新的信息
  condition=command_parse.group(3).strip()  #检索条件
  data_file_bak=''.join([data_file,'.bak'])

  info = ''.join(['{', info.replace('=', ':'), '}']) #将需更新的信息按字典格式修饰字符串
  info = eval(re.sub(r'(\w+)\s*:', r'"\1":', info)) #将字符串进一步修饰最终转化成字典
  count = 0
  staff_list = []
  with open(data_file,'r',encoding='utf-8') as fr,\
    open(data_file_bak,'w',encoding='utf-8') as fw:
   for line in fr:
    staff_temp=staff(*line.strip().split(','))
    if(verify(staff_temp,condition)): #验证员工信息是否符合条件
     staff_temp.update(**info)  #调用员工对象成员函数更新信息
     count += 1
     staff_list.append(staff_temp)
    fw.write(staff_temp.allinfo)
    fw.write('\n')
   fw.flush()
  os.remove(data_file)
  os.rename(data_file_bak,data_file)
  print("数据库本次共\033[31;1m更新%d条\033[0m员工信息,如下:"%count)
  for staff_temp in staff_list:
   staff_temp.print_info('*') #更新记录打印
 else:
  error(command)

def search(command):  #查询员工记录函数
 command_parse=re.search(r'select\s(.*?)from\s(.*?)where\s(.*)',command) #指令解析
 if(command_parse):
  info=command_parse.group(1).strip()   #检索结束后需显示的信息,"*"为显示整体记录
  data_file=command_parse.group(2).strip() #数据库文件
  condition=command_parse.group(3).strip() #检索条件
  count = 0
  staff_list = []
  with open(data_file,'r',encoding='utf-8') as fr:
   for line in fr:
    staff_temp=staff(*line.strip().split(','))
    if(verify(staff_temp,condition)): #验证员工信息是否符合条件
     count += 1
     staff_list.append(staff_temp)
  print("数据库本次共\033[31;1m查询到%d条\033[0m员工信息,如下:" % count)
  for staff_temp in staff_list:
   staff_temp.print_info(info)  #查询记录打印
 else:
  error(command)

def verify(staff_temp,condition):    #员工信息验证函数,传入一个员工对象和条件字符串
 if condition.strip()=='*':return True #如果条件为'*',即所有记录都满足条件
 condition_list=condition.split()   #检索条件字符串转列表
 if len(condition_list)==0:return False
 logic_str=['and','or','not'] #逻辑运算字符串 且、或、非
 logic_exp=[]     #单个条件的逻辑表达式组成的列表,形如[‘age',' ','>','=',20] 或 [‘dept',' ','like',' ','HR']
 logic_list=[]     #每个条件的表达式的计算结果再重组后的列表,形如 [‘True','and','False','or','not','False']
 for i in condition_list:
  if i in logic_str:
   if(len(logic_exp)!=0):
    logic_list.append(str(logic_cal(staff_temp,logic_exp))) #逻辑表达式计算并将返回的True或False转化成字符串添加到列表
   logic_list.append(i)
   logic_exp=[]
  else:
   logic_exp.append(i)
 logic_list.append(str(logic_cal(staff_temp, logic_exp)))
 return eval(' '.join(logic_list)) #列表转化成数学表达式完成所有条件的综合逻辑运算,结果为True或False

def logic_cal(staff_temp,logic_exp): #单个逻辑表达式的运算函数
 logic_exp = re.search('(.+?)([=<>]{1,2}|like)(.+)',''.join(logic_exp)) #表达式列表优化成三个元素,形如[‘age','>=',20] 或 [‘dept','like','HR']
 if(logic_exp):
  logic_exp=list(logic_exp.group(1,2,3))
  if(hasattr(staff_temp,logic_exp[0])):
   logic_exp[0] = getattr(staff_temp,logic_exp[0])
  else:
   return False
  if logic_exp[1]=='=':  #指令中的'='转化成程序中相等判别的"=="
   logic_exp[1]='=='
  if logic_exp[1]=='like':  #运算符为like的表达式运算
   return re.search(logic_exp[2].strip("'").strip('"'),logic_exp[0]) and True
  elif(logic_exp[0].isdigit() and logic_exp[2].isdigit()): #两头为数字的运算,直接eval函数转数学表达式
   return eval(''.join(logic_exp))
  elif(logic_exp[1]=='=='): #非数字的运算,即字符串运算,此时逻辑符只可能是‘=',若用eval函数则字符串会转成无定义变量而无法计算,所以拿出来单独用"=="直接计算
   return logic_exp[0]==logic_exp[2].strip("'").strip('"') #字符串相等判别,同时消除指令中字符串引号的影响,即输引号会比记录中的字符串多一层引号
  else:   #其他不合语法的条件格式输出直接返回False
   return False
 else:
  return False

if __name__=='__main__':  #主函数,数据库指令输入和执行
 while(True):
  command=input("请按语法输入数据库操作指令:") #指令输入
  if command=='exit':
   print("数据库操作结束,成功退出!".center(50, '*'))
   break
  command_exe(command)  #指令执行

以上这篇Python 模拟员工信息数据库操作的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python isinstance函数介绍
Apr 14 Python
用python找出那些被“标记”的照片
Apr 20 Python
python制作小说爬虫实录
Aug 14 Python
python json.loads兼容单引号数据的方法
Dec 19 Python
django 消息框架 message使用详解
Jul 22 Python
简单了解Django应用app及分布式路由
Jul 24 Python
python单线程下实现多个socket并发过程详解
Jul 27 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
Python如何根据时间序列数据作图
May 12 Python
5款实用的python 工具推荐
Oct 13 Python
Scrapy爬虫实例讲解_校花网
Oct 23 #Python
Python学习笔记之if语句的使用示例
Oct 23 #Python
Django实现快速分页的方法实例
Oct 22 #Python
python使用SMTP发送qq或sina邮件
Oct 21 #Python
python爬虫headers设置后无效的解决方法
Oct 21 #Python
Python 结巴分词实现关键词抽取分析
Oct 21 #Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 #Python
You might like
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
php从身份证获取性别和出生年月
2017/02/09 PHP
如何离线执行php任务
2017/02/21 PHP
php之可变函数的实例详解
2017/09/13 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
JavaScript Math.round() 方法
2015/12/18 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
原生js实现class的添加和删除简单代码
2016/07/12 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
JS实现的ajax和同源策略(实例讲解)
2017/12/01 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
17个Python小技巧分享
2015/01/23 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
Python多继承原理与用法示例
2018/08/23 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
Python常用数据分析模块原理解析
2020/07/20 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
2021/02/02 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
英国高街品牌:Miss Selfridge(塞尔弗里奇小姐)
2016/09/21 全球购物
中国旅游网站:途牛旅游网
2019/09/29 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
Python文件操作的面试题
2013/06/22 面试题
幼师求职自荐信范文
2014/01/26 职场文书
门诊手术室工作制度
2014/01/30 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
教师工作表现评语
2014/12/31 职场文书
房屋维修申请报告
2015/05/18 职场文书
民间借贷被告代理词
2015/05/23 职场文书
2015年体检中心工作总结
2015/05/27 职场文书
怎样写好工作计划
2019/04/10 职场文书
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS