zoukankan      html  css  js  c++  java
  • 【python】——sql模拟

    一.作业需求:

    当然此表你在文件存储时可以这样表示

    1,Alex Li,22,13651054608,IT,2013-04-01

    现需要对这个员工信息文件,实现增删改查操作

    1. 可进行模糊查询,语法至少支持下面3种:
      1.   select name,age from staff_table where age > 22
      2.   select  * from staff_table where dept = "IT"
      3.       select  * from staff_table where enroll_date like "2013"
      4. 查到的信息,打印后,最后面还要显示查到的条数 
    2. 可创建新员工纪录,以phone做唯一键,staff_id需自增
    3. 可删除指定员工信息纪录,输入员工id,即可删除
    4. 可修改员工信息,语法如下:
      1.   UPDATE staff_table SET dept="Market" WHERE where dept = "IT"

     注意:以上需求,要充分使用函数,请尽你的最大限度来减少重复代码!

    二.流程图

    三.代码

    1.数据库文件

    name:mysql.user

    1,陈浩元,21,15910484014,运维,2017-09-19
    2,刘阔,21,15930208897,运维,2017-09-19
    3,夏婉婉,25,18310418795,测试工程师,2017-09-19
    4,彭思龙,33,18610294009,测试攻城狮,2017-09-18
    5,党禾迪,31,13525891354,运维,2017-09-18
    6,孙京国,24,15801627076,运维工程师,2017-09-18
    7,王冬,27,13522335607,运维,2017-09-18
    8,章曾,22,18510736774,运维,2017-09-18
    9,陈俊明,32,13581881029,运维背锅者,2017-09-18
    10,戴成旭,30,18600678947,运维,2017-09-18
    11,肖静,24,    15038060638,None,2017-09-18
    12,王振山,29,15801236442,运维,2017-09-18
    13,韩韬,25,    15600112051,系统集成,2017-09-18
    14,韩钰柯,20,15718833136,运维, 2017-09-18
    15,王兴平,25,15652848975,运维工程师,2017-09-18
    16,崔晓娜,18,13716114868,运维,2017-09-18
    17,田晨超,26,18211169979,Linux爱好者,2017-09-18
    18,张志凡,22,17600297412,运维工程师,2017-09-18
    19,曾志高翔,23,13133326458,运维,2017-09-18
    20,翁建伟,30,13810656274,无,2017-09-18
    21,王华强,33,18310189881,测试,2017-09-18
    22,蔡志亮,16,13161389642,运维,2017-09-18
    23,颜明建,25,18513852990,打杂,2017-09-18
    24,李毅,18,13621289567,QA,2017-09-18
    25,刘振涛,25,15101545560,高级运维工程师,2017-09-18
    26,李善超,22,17610360660,网络安全,2017-09-
    27,金煜东,23,18513911287,运维,2017-09-18
    28,许晨阳,25,18811780053,运维,2017-09-18
    29,孙克东,24,13611167868,运维工程师,2017-09-18
    30,王朝,24,17000106910,DBA,2017-09-18
    31,段晓冲,22,13613435992,运维,2017-09-18
    32,江帆,26,18211180628,运维,2017-09-18
    33,李众,18,17600148970,运维工程师,2017-09-18
    34,何金刚,28,15176039493,运维工程师,2017-09-18
    35,张美玲,23,15733268566,linux运维,2017-09-18
    36,唐磊,30,18514030312,测试,2017-09-18
    37,黄骁瀚,25,18701606481,系统工程师,2017-09-18
    38,李英琦,23,15001097238,运维,2017-09-18
    39,刘亮亮,26,18636658660,运维,2017-09-18
    40,赵宏宇,25,15941003093,Linux运维工程师,2017-09-18
    41,黄宏伟,22,18811705542,运维,2017-09-18
    42,何玲,24,    18811558232,数据分析师,2017-09-18
    43,杨建波,32,15810982260,系统工程师,2017-09-18
    44,倪耀毅,32,18810817709,自动化测试,2017-09-18
    45,乔路,26,15100326203,运维,2017-09-18
    46,赵凯,22,18612439108,运维工程师,2017-09-18
    View Code

    2.代码

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    #Author:__Json.Zzgx__
    import os
    def sql_cmd(sql):
        parse_func={
            'insert':insert_cmd,
            'delete':delete_cmd,
            'update':update_cmd,
            'select':select_cmd,
        }
        sql_l=sql.split(' ')
        func=sql_l[0]
        res=''
        if func in parse_func:
            res=parse_func[func](sql_l)
        return res
    
    def insert_cmd(sql_1):
        sql_dic={
            'func':insert,
            'into':[],
            'values':[]
        }
        return handle_cmd(sql_1,sql_dic)
    
    def delete_cmd(sql_1):
        sql_dic={
            'func':delete,
            'from':[],
            'where':[]
        }
        return handle_cmd(sql_1,sql_dic)
    
    def update_cmd(sql_1):
        sql_dic={
            'func':update,
            'update':[],
            'set':[],
            'where':[]
        }
        return handle_cmd(sql_1,sql_dic)
    def select_cmd(sql_1):
        sql_dic={
            'func':select,
            'select':[],
            'from':[],
            'where':[],
            'limit':[],
        }
        return handle_cmd(sql_1,sql_dic)
    
    def handle_cmd(sql_l,sql_dic):
        tag=False
        for item in sql_l:
            if item in sql_dic:
                tag=True
                key=item
            if tag and item not in sql_dic:
                sql_dic[key].append(item)
        if sql_dic.get('where'):
            sql_dic['where']=where_cmd(sql_dic.get('where'))
        return sql_dic
    
    def where_cmd(where_l):
        res=[]
        key=['and','or','not']
        char=''
        for i in where_l:
            if i not in key:
                char=char+i
            if i in key:
                char=three_cmd(char)
                res.append(char)
                res.append(i)
                char=''
        char = three_cmd(char)
        res.append(char)
        return res
    
    def three_cmd(str):
        key=['>','<','=']
        res=[]
        char=''
        for i in str:
            if i not in key:
                char += i
            if i in key:
                res.append(char)
                res.append(i)
                char=''
        res.append(char)
        if len(res) == 1:
            res=res[0].split('like')
            res.insert(1,'like')
        return res
    
    def sql_action(sql_dic):
        return sql_dic["func"](sql_dic)
    
    def select(sql_dic):
        db=sql_dic["from"][0].strip()
        f=open("%s" %(db),"r",encoding="utf-8")
        where_res=where_action(f,sql_dic["where"])
        f.close()
        limit_res=limit_action(sql_dic["limit"],where_res)
        select_res=select_action(sql_dic["select"],limit_res)
        return select_res
    
    def insert(sql_dic):
        try:
            ph=sql_dic["values"][0].strip("'").split(",")[2]
            ph=sql_dic["values"][0].strip('"').split(",")[2]
        except:
            pass
        sql="select * from mysql.user where phone = %s" %ph
        a=sql_action(sql_cmd(sql))[1]
        if len(a):
            return "你的手机号%s已存在,更换其他手机号!" %ph
        else:
            id=1
            db=sql_dic["into"][0].strip()
            with open("%s" %db,"ab+") as f ,
                    open("%s"%db,'r', encoding="utf-8") as f1:
                for line in f1:
                    id=id+1
                try:
                    record=sql_dic["values"][0].strip("'").split(",")
                    record=sql_dic["values"][0].strip('"').split(",")
                except:
                    pass
                record.insert(0,str(id))
                record_new=",".join(record)+"
    "
                f.write(record_new.encode("utf-8"))
                f.flush()
            return "%s插入成功" %record_new
    
    def delete(sql_dic):
        db=sql_dic["from"][0].strip()
        filename="%s" %(db)
        filename_new=db+"_new"
        file=open(filename,'r',encoding="utf-8")
        where_res=where_action(file,sql_dic["where"])
        file.close()
        if len(where_res)==0:
                return "删除记录不存在!"
        else:
            tmp=[]
            for line in where_res:
                    tmp.append(line.strip())
            with open(filename,'r',encoding="utf-8") as f,
                    open(filename_new,'w',encoding="utf-8") as f1:
                    id = 0
                    for f_line in f:
                        if f_line.strip() in tmp:
                            continue
                        else:
                            id=1+id
                            con = f_line.strip("'").split(",")
                            con = f_line.strip('"').split(",")
                            con[0]=str(id)
                            content=",".join(con)
                            f1.write(content)
                    f1.flush()
            os.rename(filename,filename+"b")
            os.rename(filename_new,filename)
            os.remove(filename+"b")
            return "共计删除%s条数据" %len(where_res)
    
    def update(sql_dic):
        db=sql_dic["update"][0].strip()
        name="%s" %(db)
        name_new=db+"_new"
        file=open(name,'r',encoding="utf-8")
        records=where_action(file,sql_dic["where"])
        records_new=[]
        file.close()
        set_tmp=sql_dic["set"]
        data_tmp={}
        for i in set_tmp[0].split(","):
            if len(i):
                s=i.split("=")
                try:
                    data_tmp[s[0]]=str(s[1].strip("'"))
                    data_tmp[s[0]]=str(s[1].strip('"'))
                except:
                    pass
        if len(records)==0:
                return "要修改的记录不存在!"
        else:
            for line in records:
                    dic={}
                    dic['id'],dic['name'],dic['age'],dic['phone'],dic['dept'],dic['date']=line.split(",")
                    for data_k in data_tmp:
                        if data_k in dic:
                            dic[data_k]=data_tmp[data_k]
                    str_tmp=[]
                    for k in dic:
                        str_tmp.append(dic[k])
                    records_new.append(str_tmp)
            str_tmp=[]
            for line in records:
                str_tmp.append(line.strip())
            with open(name,'r',encoding="utf-8") as f,
                    open(name_new,'w',encoding="utf-8") as f1:
                    for f_line in f:
                        if f_line.strip() in str_tmp:
                            temp=records_new[str_tmp.index(f_line.strip())]
                            temp=",".join(temp)
                            f1.write(temp)
                            continue
                        f1.write(f_line)
                        f1.flush()
            os.rename(name,name+"b")
            os.rename(name_new,name)
            os.remove(name+"b")
            return "共计修改%s条数" %len(records)
    
    def where_action(f,where_sql):
        res=[]
        if len(where_sql):
            for line in f:
                dic={}
                dic['id'], dic['name'], dic['age'], dic['phone'], dic['dept'], dic['date'] = line.split(",")
    
                logic_res=logic_action(dic,where_sql)
                if logic_res:
                    res.append(line)
        else:
            res=f.readlines()
    
        return res
    
    def logic_action(dic,where_l):
        res=[]
        for i in where_l:
            if type(i) is list:
                a,o,b=i
                if i[1] == '=':
                    o="%s=" %i[1]
                dic_v=""
                if dic[a].isdigit():
                        dic_v=int(dic[a])
                        b=int(b)
                else:
                        dic_v="'%s'" %dic[a]
                if o != 'like':
                    if type(b)==str:
                        try:
                            b= b.strip("'")
                            b= b.strip('"')
                        except:
                            pass
                        b="'%s'" %b
                    i=str(eval("%s%s%s" %(dic_v,o,b)))
                else:
                    try:
                       b= b.strip("'")
                       b= b.strip('"')
                    except:
                        pass
                    if b in dic_v:
                        i='True'
                    else:
                        i='False'
            res.append(i)
    
        res=eval(' '.join(res))
        return res
    
    def limit_action(limit_sql,where_res):
        if len(limit_sql)!=0:
            index=int(limit_sql[0])
            res=where_res[0:index]
        else:
            res=where_res
        return res
    
    def select_action(select_sql,limit_res):
        res=[]
        select_field=select_sql
        if select_sql[0]=="*":
            res=limit_res
            select_field=['id', 'name', 'age', 'phone', 'dept', 'date']
        else:
            for line in limit_res:
                dic={}
                dic['id'], dic['name'], dic['age'], dic['phone'], dic['dept'], dic['date'] = line.split(",")
                r=[]
                for field in select_field[0].split(","):
                    r.append(dic[field])
                res.append(",".join(r))
        return [select_field,res]
    
    if __name__ == '__main__':
        print("表名:mysql.user,字段:id,name,age,phone,dept,date")
        while True:
            sql=input("sql> ").strip()
            if sql == 'exit':break
            if len(sql) == 0 :continue
            sql_dic=sql_cmd(sql)
            if len(sql_dic) == 0:continue
            res=sql_action(sql_dic)
            if type(res)==list:
                for line in res[1]:
                    print(line.strip())
                print("
    共计查询出%s条数据" %len(res[1]))
            else:
                print(res)
    View Code

    【开源是一种精神,分享是一种美德】

      — By GoodCook

      — 笔者QQ:253097001

      — 欢迎大家随时来交流

      —原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。

  • 相关阅读:
    GIL锁、进程池和线程池、同步和异步
    线程
    socket编程
    单例模式
    反射、自定义内置方法来定制类的功能、元类
    elasticSearch(一)--数据1
    docker学习整理(三)
    docker学习整理(二)
    docker学习整理(一)
    IDEA 配置mybatis生成代码
  • 原文地址:https://www.cnblogs.com/goodcook/p/7575191.html
Copyright © 2011-2022 走看看