⑴ python对数据库表格里面的内容增删查改怎么写
本文主要给大家介绍了关于python模拟sql语句对员工表格进行增删改查的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:
具体需求:
员工信息表程序,实现增删改查操作:
可进行模糊查询,语法支持下面3种:
select name,age from staff_data where age > 22 多个查询参数name,age 用','分割
select * from staff_data where dept = 人事
select * from staff_data where enroll_date like 2013
查到的信息,打印后,最后面还要显示查到的条数
可创建新员工纪录,以phone做唯一键,phone存在即提示,staff_id需自增,添加多个记录record1/record2中间用'/'分割
insert into staff_data values record1/record2
可删除指定员工信息纪录,输入员工id,即可删除
delete from staff_data where staff_id>=5andstaff_id<=10
可修改员工信息,语法如下:
update staff_table set dept=Market,phone=13566677787 where dept = 运维 多个set值用','分割
使用re模块,os模块,充分使用函数精简代码,熟练使用 str.split()来解析格式化字符串
由于,sql命令中的几个关键字符串有一定规律,只出现一次,并且有顺序!!!
按照key_lis = ['select', 'insert', 'delete', 'update', 'from', 'into', 'set', 'values', 'where', 'limit']的元素顺序分割sql.
分割元素作为sql_dic字典的key放进字典中.分割后的列表为b,如果len(b)>1,说明sql字符串中含有分割元素,同时b[0]对应上一个分割元素的值,b[-1]为下一次分割对象!
这样不断迭代直到把sql按出现的所有分割元素分割完毕,但注意这里每次循环都是先分割后赋值!!!当前分割元素比如'select'对应的值,需要等到下一个分割元素
比如'from'执行分割后的列表b,其中b[0]的值才会赋值给sql_dic['select'] ,所以最后一个分割元素的值,不能通过上述循环来完成,必须先处理可能是最后一个分割元素,再正常循环!!
在这sql语句中,有可能成为最后一个分割元素的 'limit' ,'values', 'where', 按优先级别,先处理'limit' ,再处理'values'或 'where'.....
处理完得到sql_dic后,就是你按不同命令执行,对数据文件的增删改查,最后返回处理结果!!
示例代码# _*_coding:utf-8_*_# Author:Jaye Heimport reimport os def sql_parse(sql, key_lis): ''' 解析sql命令字符串,按照key_lis列表里的元素分割sql得到字典形式的命令sql_dic :param sql: :param key_lis: :return: ''' sql_list = [] sql_dic = {} for i in key_lis: b = [j.strip() for j in sql.split(i)] if len(b) > 1: if len(sql.split('limit')) > 1: sql_dic['limit'] = sql.split('limit')[-1] if i == 'where' or i == 'values': sql_dic[i] = b[-1] if sql_list: sql_dic[sql_list[-1]] = b[0] sql_list.append(i) sql = b[-1] else: sql = b[0] if sql_dic.get('select'): if not sql_dic.get('from') and not sql_dic.get('where'): sql_dic['from'] = b[-1] if sql_dic.get('select'): sql_dic['select'] = sql_dic.get('select').split(',') if sql_dic.get('where'): sql_dic['where'] = where_parse(sql_dic.get('where')) return sql_dic def where_parse(where): ''' 格式化where字符串为列表where_list,用'and', 'or', 'not'分割字符串 :param where: :return: ''' casual_l = [where] logic_key = ['and', 'or', 'not'] for j in logic_key: for i in casual_l: if i not in logic_key: if len(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 = [k for k in casual_l if k] where_list = three_parse(casual_l, logic_key) return where_list def three_parse(casual_l, logic_key): ''' 处理临时列表casual_l中具体的条件,'staff_id>5'-->['staff_id','>','5'] :param casual_l: :param logic_key: :return: ''' where_list = [] for i in casual_l: if i not in logic_key: b = i.split('like') if len(b) > 1: b.insert(1, 'like') where_list.append(b) else: key = ['<', '=', '>'] new_lis = [] opt = '' lis = [j for j in re.split('([=<>])', i) if j] for k in lis: if k in key: opt += k else: new_lis.append(k) new_lis.insert(1, opt) where_list.append(new_lis) else: where_list.append(i) return where_list def sql_action(sql_dic, title): ''' 把解析好的sql_dic分发给相应函数执行处理 :param sql_dic: :param title: :return: ''' key = {'select': select, 'insert': insert, 'delete': delete, 'update': update} res = [] for i in sql_dic: if i in key: res = key[i](sql_dic, title) return res def select(sql_dic, title): ''' 处理select语句命令 :param sql_dic: :param title: :return: ''' with open('staff_data', 'r', encoding='utf-8') as fh: 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) return search_res def insert(sql_dic, title): ''' 处理insert语句命令 :param sql_dic: :param title: :return: ''' with open('staff_data', 'r+', encoding='utf-8') as f: data = f.readlines() phone_list = [i.strip().split(',')[4] for i in data] ins_count = 0 if not data: new_id = 1 else: last = data[-1] last_id = int(last.split(',')[0]) new_id = last_id+1 record = sql_dic.get('values').split('/') for i in record: if i.split(',')[3] in phone_list: print('\033[1;31m%s 手机号已存在\033[0m' % i) else: new_record = '%s,%s\n' % (str(new_id), i) f.write(new_record) new_id += 1 ins_count += 1 f.flush() return ['insert successful'], [str(ins_count)] def delete(sql_dic, title): ''' 处理delete语句命令 :param sql_dic: :param title: :return: ''' with open('staff_data', 'r', encoding='utf-8') as r_file,\ open('staff_data_bak', 'w', encoding='utf-8') as w_file: del_count = 0 for line in r_file: dic = dict(zip(title.split(','), line.split(','))) filter_res = logic_action(dic, sql_dic.get('where')) if not filter_res: w_file.write(line) else: del_count += 1 w_file.flush() os.remove('staff_data') os.rename('staff_data_bak', 'staff_data') return ['delete successful'], [str(del_count)] def update(sql_dic, title): ''' 处理update语句命令 :param sql_dic: :param title: :return: ''' set_l = sql_dic.get('set').strip().split(',') set_list = [i.split('=') for i in set_l] update_count = 0 with open('staff_data', 'r', encoding='utf-8') as r_file,\ open('staff_data_bak', 'w', encoding='utf-8') as w_file: for line in r_file: dic = dict(zip(title.split(','), line.strip().split(','))) filter_res = logic_action(dic, sql_dic.get('where')) if filter_res: for i in set_list: k = i[0] v = i[-1] dic[k] = v line = [dic[i] for i in title.split(',')] update_count += 1 line = ','.join(line)+'\n' w_file.write(line) w_file.flush() os.remove('staff_data') os.rename('staff_data_bak', 'staff_data') return ['update successful'], [str(update_count)] def where_action(fh, where_list, title): ''' 具体处理where_list里的所有条件 :param fh: :param where_list: :param title: :return: ''' res = [] if len(where_list) != 0: for line in fh: dic = dict(zip(title.split(','), line.strip().split(','))) if dic['name'] != 'name': logic_res = logic_action(dic, where_list) if logic_res: res.append(line.strip().split(',')) else: res = [i.split(',') for i in fh.readlines()] return res pass def logic_action(dic, where_list): ''' 判断数据文件中每一条是否符合where_list条件 :param dic: :param where_list: :return: ''' logic = [] for exp in where_list: if type(exp) is list: exp_k, opt, exp_v = exp if exp[1] == '=': opt = '==' logical_char = "'%s'%s'%s'" % (dic[exp_k], opt, exp_v) if opt != 'like': exp = str(eval(logical_char)) else: if exp_v in dic[exp_k]: exp = 'True' else: exp = 'False' logic.append(exp) res = eval(' '.join(logic)) return res def limit_action(filter_res, limit_l): ''' 用列表切分处理显示符合条件的数量 :param filter_res: :param limit_l: :return: ''' if limit_l: index = int(limit_l[0]) res = filter_res[:index] else: res = filter_res return res def search_action(limit_res, select_list, title): ''' 处理需要查询并显示的title和相应数据 :param limit_res: :param select_list: :param title: :return: ''' res = [] fields_list = title.split(',') if select_list[0] == '*': res = limit_res else: fields_list = select_list for data in limit_res: dic = dict(zip(title.split(','), data)) r_l = [] for i in fields_list: r_l.append((dic[i].strip())) res.append(r_l) return fields_list, res if __name__ == '__main__': with open('staff_data', 'r', encoding='utf-8') as f: title = f.readline().strip() key_lis = ['select', 'insert', 'delete', 'update', 'from', 'into', 'set', 'values', 'where', 'limit'] while True: sql = input('请输入sql命令,退出请输入exit:').strip() sql = re.sub(' ', '', sql) if len(sql) == 0:continue if sql == 'exit':break sql_dict = sql_parse(sql, key_lis) fields_list, fields_data = sql_action(sql_dict, title) print('\033[1;33m结果如下:\033[0m') print('-'.join(fields_list)) for data in fields_data: print('-'.join(data))
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
⑵ 企业员工信息表:员工编号 性别 姓名 出生年月 登记日期 1.编写一个存储过程实现员工信息的添加
CREATE TABLE T_YGXXB( --员工信息表
YGBH char(6) primary key, --员工编号,主键,格式:此基YYxxxx YY年2位 xxxx流水
YGXM varchar2(8), --员工姓名
YGXB char(1) CHECK (ygxb IN ('M','W')), --员工性别,男=M 女=W
CSRQ char(8)); --出生日期,格式:YYYYMMDD
1、返扒埋存储过程
create or replace procere P_insert(
v_ygbh IN varchar2,
v_ygxm IN varchar2,
v_ygxb IN varchar2,
v_csrq IN varchar2) is
begin
INSERT INTO t_ygxxb values(v_ygbh,v_ygxm,v_ygxb,v_csrq);
COMMIT;
end P_insert;
调用:BEGIN p_insert('130001','曹操','M','01550101'); END;
2、Select * from t_ygxxb where ygbh='&bh'漏蚂;
3、函数
create or replace function F_max(i in int,j in int,k IN INT) return integer is
Result integer;
begin
if i>=j then
IF i>=k THEN Result:=i;
ELSE Result:=k;
END IF;
ELSE
IF j>=k THEN Result:=j;
ELSE Result:=k;
END IF;
end if;
return(Result);
end F_max;
调用:BEGIN dbms_output.put_line(f_max(5,6,7)); END;
4、函数
create or replace function F_name(v_ygbh varchar2) return varchar2 is
v_name VARCHAR2(8);
begin
SELECT ygxm INTO v_name FROM t_ygxxb WHERE ygbh=v_ygbh;
return(v_name);
end F_name;
调用:BEGIN dbms_output.put_line(f_name('130001')); END;
⑶ 二级python程序题
1、利用random随机库里的函数,生成一个由四个大小写字母组成的验证码,显示在屏幕上
我的解答:
系统解答:
系统解析:
1.用随机数要导入random库,并记别名为r
2.先定义好要使用的陪枣英文字母表;
3.用seed(1)初始化随机函数,保证后面产生的随机数跟标准答案的一致
4.初始化密码code为一个空字符串;
系统解答:
系统解析:
题目给出了基本数据的定义,后面要使用这些变量
在for循环里面,主要问题是画笔的定位,要考虑圆心的位置是(0,0)的时候,画笔要移动到圆心位置正下方,因此坐标点是(0,-ra[i])
画笔颜色要从颜色列表里选取
画圆李携的半径也从变量里面获取
系统解答:
系统解析:
字典members里的value是个列表,所以需要用到列表的索引
对着字典members遍历,按照要求显示每个员工的工资和部门信息,另外还要取得工资和部门的名称存入字典sal_dep
为了统计工资最高的部门的工资,需要字典sal_dep来保存这两个信息
并且这个字典的key应该是工资数
用max函数对字典sal_dep的key进行求最大值的计算,并将最大值赋给变量max_val
再从字典里,取出key为max_val的value赋给变量max_name
最后按照要求显示结果
系统解答:
5、输入一个正整数(范围为65-96),请输出对应的Unicode字符。
6、获得用户输入的一个字符串,将字符串逆序输出,同时紧接着输出字符串的个数
我的解答:
我的是错的,因为reverse()是对列表进行反转,而不是字符串,所以正确解答应该是:
7、以123为随机哪乱伏数种子,随机生成10个在1(含)到999(含)之间的随机整数,每个随机数后跟随一个逗号进行分隔,屏幕输出这10个随机数。
⑷ 学习python必备的基础知识
python作为当下最热门的计算机编程语言之一,是许多互联网大厂(如阿里腾讯等)在招聘时会作出要求的能力之一。学好python对于将来大数据方向、云计算方向等物联网时代新兴岗位的学习很有帮助。
想要学习Python,需要掌握的内容还是比较多的,对于自学的同学来说会有一些难度,不推荐自学能力差的人。我们将学习的过程划分为4个阶段,每个阶段学习对应的内容,具体的学习顺序如下:
Python学习顺序:
①Python软件开发基础
掌握计算机的构成和工作原理
会使用Linux常用工具
熟练使用Docker的基本命令
建立Python开发环境,并使用print输出
使用Python完成字符串的各种操作
使用Python re模块进行程序设计
使用Python创建文件、访问、删除文件
掌握import 语句、From…import 语句、From…import* 语句、方法的引用、Python中的包
②Python软件开发进阶
能够使用Python面向对象方法开发软件
能够自己建立数据库,表,并进行基本数据库操作
掌握非关系数据库MongoDB的使用,掌握Redis开发
能够独立完成TCP/UDP服务端客户端软件开发,能够实现ftp、http服务器,开发邮件软件
能开发多进程、多线程软件
③Python全栈式WEB工程师
能够独立完成后端软件开发,深入理解Python开发后端的精髓
能够独立完成前端软件开发,并和后端结合,熟练掌握使用Python进行全站Web开发的技巧
④Python多领域开发
能够使用Python熟练编写爬虫软件
能够熟练使用Python库进行数据分析
招聘网站Python招聘职位数据爬取分析
掌握使用Python开源人工智能框架进行人工智能软件开发、语音识别、人脸识别
掌握基本设计模式、常用算法
掌握软件工程、项目管理、项目文档、软件测试调优的基本方法
想要系统学习,你可以考察对比一下开设有IT专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能,南京北大青鸟、中博软件学院、南京课工场等都是不错的选择,建议实地考察对比一下。
祝你学有所成,望采纳。
⑸ 数据库作业 有一个员工信息表(属性表) 要求每名员工对自己的信息有查询功能 怎么做啊
还要建几个表
查询所有员工
-- 查询所有女员工
---查询一个员工的工作业绩
-- 把上面的查询写成一个存储过程
---找出业绩最好的员工
-- 显示前三条业绩最好的员工信息
---显示显示 业厅祥改绩第 4==7条
---显示用户和它订房的信息
-- 如 张三 身份证 501 双人间 价格
--把用户消费做宴扮成一个视图
--找出所有没有入住的房间信息
-- 定义存储过程 输入一个身份证号查找这个人所在的房间
-- 定义存储过程 输入身份证找出这个人的所有消费
--客户编写会员扮判卡 入住次数〉5 金牌会员 3--5 银
⑹ python AttributeError: 'tuple' object has no attribute 'keys',不知道哪里错了。。
for i in results[0].keys():这行错的。
results的数据类型应该是数组
类似 [(字段值1,字段值2,。。。),((字段值1,字段值2,。。。睁毁尺)]
所以results[0] 是个元组类型,元组类型没有这个keys的属性。
原因:append会修改a本身,并且返回None。不能把返回值再赋值给a。
a=[]
b=[1,2,3,4]
a = a.append(b)
执行一次后发现a的类型变为了NoneType。
下次执行时就会出现如题所示的错误。
把a = a.append(b)改为a.append(b)后问题解决。
(6)python员工信息表作业扩展阅读:
一个数组中的所有元素具有相同的数据类型(在C、C++、Java、pascal中都这样。但也并非所有涉及数组的地方都这样,比如在Visual Foxpro中的数组就并没这样的要求)。当然,当数据类型为 Variant 时,各个元素能余歼够包含不同种类的数据(对象、字符串、悉高数值等等)。可以声明任何基本数据类型的数组,包括用户自定义类型和对象变量。
如果要用户输入的是一个数组,一般是用一个循环,但是在输入前也需要固定数组的大小。
⑺ 第四章 简单查询 课后作业
练习一:
1.使用两种方式查询所有员工(EMP)信息
select * from emp;
select empno 员工编号,ename 员工姓名,job 员工职位,mgr 领导编号,hiredate 入职日期,sal 工资,comm 奖金,deptno 部门编号
from emp;
2.查询(EMP)员工编号、员工姓名、员工职位、员工月薪、工作部门编号。
select empno 员工编号,ename 员工姓名,job 员工职位,sal 员工月薪,deptno 工作部门编号 from emp;
练习二:
1.员工转正后,月薪上调20%,请查询出所有员工转正后的月薪。
select *,sal*(1+0.2)+ifnull(comm,0) 员工转正后的月薪 from emp;
2.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的年薪所得
(不考虑奖金部分,年薪的试用期6个月的月薪+转正后6个月的月薪)
select *,sal*6+6*(1.2*sal) 第一年年薪 from emp;
练习三:
1.员工试用期6个月,转正后月薪上调20%,请查询出所有员工工作第一年的所有收入
(需考虑奖金部分),要渣孙氏求显示列标题为员工姓名,工资收入,奖金收入,总收入。
select ename 员工姓名,sal 工资收入,comm 奖金收入,(sal+ifnull(comm,0))*6+6*(1.2*sal+ifnull(comm,0)) 总收入
from emp;
练习四:
1.查询员工表中一共有哪几种岗位类型。
select distinct job from emp;
练习五:
1. 分别查看员工表、部门表、薪资等级表的表结构。
desc emp;
describe dept;
describe salgrade;
练习六:
1.查询职位为SALESMAN的员工编号、职位、入职日期。如散
select empno 员工编号,job 职位,hiredate 入职日期 from emp
where job='SALESMAN';
2.查询1985年12月31日之前入职的员工姓名及入职日期。
select ename 员工姓名,hiredate 入职日期 from emp
where hiredate<'1985-12-31';
3.查询部门编号不在10部门的员工姓名、部门编号。
select ename 员工姓名,deptno 部门编号 from emp
where deptno<> 10;
练习七:
1.查询入职日期在82年至85年的员工姓名,入职日期。
select ename,hiredate from emp
where hiredate between '1982-01-01' and '1985-12-31';
2.查询月薪在3000到5000的员工姓名,月薪。
select ename,sal from emp
where sal between 3000 and 5000;
3.查询部门编号为10或者20的员工姓名,部门编凯扒号。
select ename,deptno from emp
where deptno in (10,20);
4.查询经理编号为7902, 7566, 7788的员工姓名,经理编号。
select ename,mgr from emp
where mgr in (7902,7566,7788);
练习八:
1.查询员工姓名以W开头的员工姓名。
select ename from emp where ename like 'W%';
2.查询员工姓名倒数第2个字符为T的员工姓名。
select ename from emp where ename like '%T_';
3.查询奖金为空的员工姓名,奖金。
select ename,comm from emp where comm is null;
练习九:
1.查询工资超过2000并且职位是MANAGER,或者职位是SALESMAN的员工姓名、职位、工资
select ename ,job ,sal from emp
where sal>2000 and job='MANAGER' or job='SALESMAN';
2.查询工资超过2000并且职位是 MANAGER或SALESMAN的员工姓名、职位、工资。
select ename ,job ,sal from emp
where sal>2000 and job in ('MANAGER','SALESMAN');
3.查询部门在10或者20,并且工资在3000到5000之间的员工姓名、部门、工资。
select ename,deptno,sal from emp
where deptno in (10,20) and sal between 3000 and 5000;
4.查询入职日期在81年,并且职位不是SALES开头的员工姓名、入职日期、职位。
select ename,hiredate,job from emp
where (hiredate between '1981-01-01' and '1981-12-31') and job not like 'SALES%';
5.查询职位为SALESMAN或MANAGER,部门编号为10或者20,姓名包含A的员工姓名、职位、部门编号。
select ename,job,deptno from emp
where job in ('SALESMAN','MANAGER') and deptno in (10,20);
练习十:
1.查询部门在20或30的员工姓名,部门编号,并按照工资升序排序。
select ename 员工姓名,deptno 部门编号 from emp
where deptno in (20,30)
order by sal ASC
2.查询工资在2000-3000之间,部门不在10号的员工姓名,部门编号,工资,并按照部门升序,工资降序排序。
select ename 员工姓名,deptno 部门编号,sal 工资 from emp
where (sal between 2000 and 3000) and deptno<>10
order by deptno asc,sal desc
3.查询入职日期在82年至83年之间,职位以SALES或者MAN开头的员工姓名,入职日期,职位,
并按照入职日期降序排序。
select ename 员工姓名,hiredate 入职日期,job 职位 from emp
where (hiredate between '1982-01-01' and '1983-12-31') and (job like 'SALES%' or job like 'MAN%')
order by hiredate desc
练习十一:
1.查询入职日期最早的前5名员工姓名,入职日期。
select ename 员工姓名,hiredate 入职日期 from emp
order by hiredate asc
limit 0,5;
2.查询工作在CHICAGO并且入职日期最早的前2名员工姓名,入职日期。
(1)一种写法:
select emp.ename 员工姓名,emp.hiredate 入职日期 from emp,dept
where emp.deptno=dept.deptno and loc='CHICAGO'
order by emp.hiredate DESC
limit 0,2;
(2)一种写法:
select ename 员工姓名,hiredate 入职日期 from emp
where deptno=(select deptno from dept where loc='CHICAGO')
order by hiredate DESC
limit 0,2;
3.按照每页显示5条记录,分别查询第1页,第2页,第3页信息,要求显示员工姓名、入职日期、部门名称。
第一页:
select ename 员工姓名,hiredate 入职日期,deptno 部门名称 from emp
order by hiredate DESC
limit 0,5;
第二页:
select ename 员工姓名,hiredate 入职日期,deptno 部门名称 from emp
order by hiredate DESC
limit 5,5;
第三页:
select ename 员工姓名,hiredate 入职日期,deptno 部门名称 from emp
order by hiredate DESC
limit 10,5;
课后作业
1.查询入职时间在1982-7-9之后,并且不从事SALESMAN工作的员工姓名、入职时间、职位。
select ename 员工姓名,hiredate 入职时间,job 职位 from emp
where hiredate>'1982-07-09' and job<>'SALESMAN'
2.查询员工姓名的第三个字母是a的员工姓名。
select ename 员工姓名 from emp
where ename like '__a%'
3.查询除了10、20号部门以外的员工姓名、部门编号。
一种写法:
select ename 员工姓名,deptno 部门编号 from emp
where deptno<>10 and deptno<>20;
一种写法:
select ename ,deptno from emp
where deptno not in (10,20);
4.查询部门号为30号员工的信息,先按工资降序排序,再按姓名升序排序。
select * from emp
where deptno=30
order by sal desc, ename asc
5.查询没有上级的员工(经理号为空)的员工姓名。
select ename 员工姓名 from emp
where mgr is null;
6.查询工资大于等于4500并且部门为10或者20的员工的姓名\工资、部门编号。
select ename 员工姓名,sal 员工工资,deptno 部门编号 from emp
where sal>=4500 and deptno in (10,20);
⑻ python删除超龄员工的一道题,我的代码如下,不知道哪里错了
我做了下,你看启裂看悄拦闭吧衡敏。