• Python入门 Day3-模拟sql语句操作


    userinfo文件格式:

    1,Alex,22,13651054608,IT
    2,Egon,23,13304320533,Tearcher
    3,nezha,25,1333235322,IT

    sql语句格式

    select name,age where age>22
    select * where job = IT
    select * where phone like 133

    要求写一个程序,可以模拟sql语句对userinfo文件做到增删改查

    思路:

    1. 处理输入的语句,一行sql语句如下,大概分为两部分,要查询的列和查询条件。我们可以据此将sql语句处理,得到两个变量col(列)和con(条件)

    2. 拿到条件col后,调用一个分析函数对条件进行分析。通常的列有以下几种查询格式:‘> < = like’。分别依据条件符号分割条件con,得到col_name,和value。并调用处理函数。

    3. 调用处理函数,需要拿到文件内容,先定义读取文件的函数。

    4. 将读取文件函数写成一个生成器函数,翻译每一行文件内容格式化的列表

    5. 在处理函数中,根据分析函数传入的结果,对文件内容进行分析。将符合条件的列返回

    6. 格式化输出。将处理函数返回的符合条件的列,根据列col,进行分析,返回符合条件的内容,并输出。

    7. 下面我们按照代码写出的思路一步一步实现这个程序

    ### 代码第一波
    # step1 接收输入的sql语句,并处理语句,得到col和con
    #exp = input('>>>').strip()
    #便于调试,我们把输入的sql语句先固定下来
    exp = ' select name,age where age>22 '
    # 处理sql语句
    col, con = exp.split('where')     #col = select name,age   con  age>22
    # 去掉查询命令select,只保留列的内容
    col = col.replace('select','').strip()  # col = name,age   *** 去掉空格很重要
    # print(col,con)
    # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数  。
    condition_analysis(con)
    # 下一步 在本段代码上方定义这个函数
     
    ### 代码第二波
    # step2
    def condition_analysis(con):
        '''判断条件中的符号,并依据符号切割条件,得到两个值'''
        if '>' in con:
            col_name, value = con.split('>')
            #  切记切记 一定要去掉空格
            col_name = col_name.strip()
            value = value.strip()
            '''分析条件完成后,调用处理函数处理条件 '''
            # filter_item(col_name, value, '>')  ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号
            correct = filter_item(col_name, value, '>')  #调用处理函数得到的结果赋值给correct,用return返回
        return correct
    
    # step1 接收输入的sql语句,并处理语句,得到col和con
    #exp = input('>>>').strip()
    #便于调试,我们把输入的sql语句先固定下来
    exp = ' select name,age where age>22 '
    # 处理sql语句
    col, con = exp.split('where')     #col = select name,age   con  age>22
    # 去掉查询命令select,只保留列的内容
    col = col.replace('select','').strip()  # col = name,age   *** 去掉空格很重要
    # print(col,con)
    # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数
    condition_analysis(con)
    # 下一步 在本段代码上方定义这个函数
    ### 代码第三波
    # step3
    def read_file():
        with open('userinfo','r') as f:
            for line in f:
                line = line.strip()  ## 一定要处理行首行位的空格  很重要
                line_list = line.split(',')  #  得到list格式的行
                yield line_list  # 用生成器的方式返回每一行的list
    
    def filter_item(col_name, value, single):  # 接收条件分析函数传入的参数
        '''在处理条件前,需要先读取文件内容,在上面定义read_file函数'''
        pass
    
    # step2
    def condition_analysis(con):
        '''判断条件中的符号,并依据符号切割条件,得到两个值'''
        if '>' in con:
            col_name, value = con.split('>')
            #  切记切记 一定要去掉空格
            col_name = col_name.strip()
            value = value.strip()
            '''分析条件完成后,调用处理函数处理条件 '''
            # filter_item(col_name, value, '>')  ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号
            correct = filter_item(col_name, value, '>')  #调用处理函数得到的结果赋值给correct,用return返回
        return correct
    
    # step1 接收输入的sql语句,并处理语句,得到col和con
    #exp = input('>>>').strip()
    #便于调试,我们把输入的sql语句先固定下来
    exp = ' select name,age where age>22 '
    # 处理sql语句
    col, con = exp.split('where')     #col = select name,age   con  age>22
    # 去掉查询命令select,只保留列的内容
    col = col.replace('select','').strip()  # col = name,age   *** 去掉空格很重要
    # print(col,con)
    # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数
    condition_analysis(con)
    # 下一步 在本段代码上方定义这个函数

         ### 代码第四波

    # step3 -2
    def read_file():
        with open('userinfo', 'r') as f:
            for line in f:
                line = line.strip()  ## 一定要处理行首行位的空格  很重要
                line_list = line.split(',')  # 得到list格式的行
                yield line_list  # 用生成器的方式返回每一行的list
    
    
    # step4 完善这个函数
    # step3 -1
    def filter_item(col_name, value, single):  # 接收条件分析函数传入的参数
        '''在处理条件前,需要先读取文件内容,在上面定义read_file函数'''
        dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4}
        correct = []  # 定义一个空列表,存放符合条件的列
        if single == '>'
            for line_list in read_file():  # 用for循环从上面读文件的迭代器中取值
                if int(line_list[dic[col_name]]) > int(value):  # 如果如何条件
                    correct.append(line_list)  # 就把这个列追加到correct
            return correct  ## 处理完之后,返回这个列给调用本函数的condition_analysi函数
    
    
    # step2
    def condition_analysis(con):
        '''判断条件中的符号,并依据符号切割条件,得到两个值'''
        if '>' in con:
            col_name, value = con.split('>')
            #  切记切记 一定要去掉空格
            col_name = col_name.strip()
            value = value.strip()
            '''分析条件完成后,调用处理函数处理条件 '''
            # filter_item(col_name, value, '>')  ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号
            correct = filter_item(col_name, value, '>')  # 调用处理函数得到的结果赋值给correct,用return返回
        return correct
    
    
    # step1 接收输入的sql语句,并处理语句,得到col和con
    # exp = input('>>>').strip()
    # 便于调试,我们把输入的sql语句先固定下来
    exp = ' select name,age where age>22 '
    # 处理sql语句
    col, con = exp.split('where')  # col = select name,age   con  age>22
    # 去掉查询命令select,只保留列的内容
    col = col.replace('select', '').strip()  # col = name,age   *** 去掉空格很重要
    # print(col,con)
    # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数
    # condition_analysis(con)  # 分析函数调用了处理函数,并接受了处理函数返回的值,并将接到的返回值返回给这里
    # 下一步 在本段代码上方定义这个函数

      ### 代码第五波

    # step3 -2
    def read_file():
        with open('userinfo', 'r') as f:
            for line in f:
                line = line.strip()  ## 一定要处理行首行位的空格  很重要
                line_list = line.split(',')  # 得到list格式的行
                yield line_list  # 用生成器的方式返回每一行的list
    
    
    # step4 完善这个函数
    # step3 -1
    def filter_item(col_name, value, single):  # 接收条件分析函数传入的参数
        '''在处理条件前,需要先读取文件内容,在上面定义read_file函数'''
        dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4}
        correct = []  # 定义一个空列表,存放符合条件的列
        if single == '>':
            for line_list in read_file():  # 用for循环从上面读文件的迭代器中取值
                if int(line_list[dic[col_name]]) > int(value):  # 如果如何条件
                    correct.append(line_list)  # 就把这个列追加到correct
            return correct  ## 处理完之后,返回这个列给调用本函数的condition_analysi函数
    
    
    # step2
    def condition_analysis(con):
        '''判断条件中的符号,并依据符号切割条件,得到两个值'''
        if '>' in con:
            col_name, value = con.split('>')
            #  切记切记 一定要去掉空格
            col_name = col_name.strip()
            value = value.strip()
            '''分析条件完成后,调用处理函数处理条件 '''
            # filter_item(col_name, value, '>')  ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号
            correct = filter_item(col_name, value, '>')  # 调用处理函数得到的结果赋值给correct,用return返回
        return correct
    
    
    # step5-2
    def show(col, correct):
        dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4}
        if col == '*': #当查询列是*的时候,要返回所有列的内容
            col_list = dic.keys()
        else:
            col_list= col.split(',')   ## 根据列生成一个列表,下面会根据这个列表从dic中取到索引值
        for line in correct:
            for col in col_list:
                print(line[dic[col]],end=' ')  ##  根据索引,输出需要的值
            print()  # 换行
    
    
    # step1 接收输入的sql语句,并处理语句,得到col和con
    # exp = input('>>>').strip()
    # 便于调试,我们把输入的sql语句先固定下来
    exp = ' select name,age where age>22 '
    # exp = ' select * where age>22 '
    
    # 处理sql语句
    col, con = exp.split('where')  # col = select name,age   con  age>22
    # 去掉查询命令select,只保留列的内容
    col = col.replace('select', '').strip()  # col = name,age   *** 去掉空格很重要
    # print(col,con)
    # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数
    # condition_analysis(con)  # 分析函数调用了处理函数,并接受了处理函数返回的值,并将接到的返回值返回给这里
    # 下一步 在本段代码上方定义这个函数
    
    
    # step5-1
    correct = condition_analysis(con)  # 需要将上面一行相同的代码注释。这里写两次是为了思路清晰。
    #  此时correct接到的值就是所有符合条件的列的完整形式了。接下来需要按照我们的需求,返回列条件col中指定的内容,在上面定义一个show函数完成操作
    show(col, correct)  # 传入的值是 需要的列条件col  和  存储所有符合条件的列的列表 correct

    至此,能查询条件中包含“>”的select代码已经完成,接下来就是 实现 “< = like”的功能了,只要复制替换重复的代码段就可以了

    实现多种条件的完成代码

    # step3 -2
    def read_file():
        with open('userinfo', 'r') as f:
            for line in f:
                line = line.strip()  ## 一定要处理行首行位的空格  很重要
                line_list = line.split(',')  # 得到list格式的行
                yield line_list  # 用生成器的方式返回每一行的list
    
    
    # step4 完善这个函数
    # step3 -1
    def filter_item(col_name, value, single):  # 接收条件分析函数传入的参数
        '''在处理条件前,需要先读取文件内容,在上面定义read_file函数'''
        dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4}
        correct = []  # 定义一个空列表,存放符合条件的列
        if single == '>':
            for line_list in read_file():  # 用for循环从上面读文件的迭代器中取值
                if int(line_list[dic[col_name]]) > int(value):  # 如果如何条件
                    correct.append(line_list)  # 就把这个列追加到correct
        elif single == '<':
            for line_list in read_file():
                if int(line_list[dic[col_name]]) < int(value):
                    correct.append(line_list)
        elif single == '=':
            for line_list in read_file():
                if line_list[dic[col_name]] == value:
                    correct.append(line_list)
        elif single == 'like':
            for line_list in read_file():
                # if int(line_list[dic[col_name]]) > int(value):
                if value in line_list[dic[col_name]]:   ## like的时候 这里需要变更一下代码,与其他不同
                     correct.append(line_list)
        return correct  ## 处理完之后,返回这个列给调用本函数的condition_analysi函数
    
    
    # step2
    def condition_analysis(con):
        '''判断条件中的符号,并依据符号切割条件,得到两个值'''
        if '>' in con:
            col_name, value = con.split('>')
            #  切记切记 一定要去掉空格
            col_name = col_name.strip()
            value = value.strip()
            '''分析条件完成后,调用处理函数处理条件 '''
            # filter_item(col_name, value, '>')  ##下一步在上面定义这个函数 传入处理条件得到的两个值和条件中的符号
            correct = filter_item(col_name, value, '>')  # 调用处理函数得到的结果赋值给correct,用return返回
        elif '<' in con:  ## 实现 < 将上面的代码段复制,替换三个符号即可,= 也是这样
            col_name, value = con.split('<')
            col_name = col_name.strip()
            value = value.strip()
            correct = filter_item(col_name, value, '<')
        elif '=' in con:
            col_name, value = con.split('=')
            col_name = col_name.strip()
            value = value.strip()
            correct = filter_item(col_name, value, '=')
        elif 'like' in con:
            col_name, value = con.split('like')
            col_name = col_name.strip()
            value = value.strip()
            correct = filter_item(col_name, value, 'like')
        return correct
    
    
    # step5-2
    def show(col, correct):
        dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4}
        if col == '*': #当查询列是*的时候,要返回所有列的内容
            col_list = dic.keys()
        else:
            col_list= col.split(',')   ## 根据列生成一个列表,下面会根据这个列表从dic中取到索引值
        for line in correct:
            for col in col_list:
                print(line[dic[col]],end=' ')  ##  根据索引,输出需要的值
            print()  # 换行
    
    
    # step1 接收输入的sql语句,并处理语句,得到col和con
    # exp = input('>>>').strip()
    # 便于调试,我们把输入的sql语句先固定下来
    # exp = ' select name,age where age>22 '
    exp = ' select * where age = 25 '
    
    # 处理sql语句
    col, con = exp.split('where')  # col = select name,age   con  age>22
    # 去掉查询命令select,只保留列的内容
    col = col.replace('select', '').strip()  # col = name,age   *** 去掉空格很重要
    # print(col,con)
    # 依照上文思路,拿到col和con之后,我们可以调用条件分析函数,分析con = age>22 这个参数
    # condition_analysis(con)  # 分析函数调用了处理函数,并接受了处理函数返回的值,并将接到的返回值返回给这里
    # 下一步 在本段代码上方定义这个函数
    
    
    # step5-1
    correct = condition_analysis(con)  # 需要将上面一行相同的代码注释。这里写两次是为了思路清晰。
    #  此时correct接到的值就是所有符合条件的列的完整形式了。接下来需要按照我们的需求,返回列条件col中指定的内容,在上面定义一个show函数完成操作
    show(col, correct)  # 传入的值是 需要的列条件col  和  存储所有符合条件的列的列表 correct
    select 代码完成版

    因为在判断符号的时候,我们使用了许多的重复代码。这里我们可以想办法优化一下它

    def read_file():
        with open('userinfo','r') as f:
            for line in f:
                line_list = line.strip().split(',')
                yield line_list
    
    def filter_item(col_name, value, codition):
        dic = {'id':0,'name':1,'age':2,'phone':3,'job':4}
        correct = []
        for line_list in read_file():
            eval(codition)  ##codition = 'int(line_list[dic[col_name]] < int(value))'  保证这行代码执行的时候,所需的每一个参数都有值。
            correct.append(line_list)
        return correct
    
    def condition_analysis(con):
        if '>' in con:
            col_name,value = con.split('>')
            codition = 'int(line_list[dic[col_name]]) > int(value)'           #在这里将原先filter_item函数执行的代码,通过字符串传递,减少filter_item函数中的判断过程。
            correct = filter_item(col_name.strip(), value.strip(), codition)  # 原先去掉col和value空格的两行代码。可以直接放到实参的位置传递。
        elif '=' in con:
            col_name,value = con.split('=')
            codition = 'int(line_list[dic[col_name]]) == int(value)'
            correct = filter_item(col_name.strip(), value.strip(), codition)
        elif '<' in con:
            col_name,value = con.split('<')
            codition = 'int(line_list[dic[col_name]]) < int(value)'
            correct = filter_item(col_name.strip(), value.strip(), codition)
        elif 'like' in con:
            col_name,value = con.split('like')
            codition = 'value in line_list[dic[col_name]]'
            correct = filter_item(col_name.strip(), value.strip(), codition)
        return correct
    
    def show(col,correct):
        dic = {'id':0,'name':1,'age':2,'phone':3,'job':4}
        if col == '*':
            col_list = dic.keys()
        else:
            col_list = col.split(',')
        for i in correct:
            for col in col_list:
                print(i[dic[col]],end=' ')
            print()
    
    exp = ' select name,age where age>22 '
    col,con = exp.split('where')
    col = col.replace('select',' ').strip()
    correct = condition_analysis(con)
    show(col,correct)
  • 相关阅读:
    virtualbox centos安装增强工具和问题详解
    Failed to load SELinux policy. Freezing
    .net mvc项目本地调试:浏览器一直转圈无法访问
    System.Security.Cryptography.CryptographicException: 出现了内部错误
    【SymmetricDS】实现新的数据库方言
    【SymmetricDS】SymmetricDS是如何工作的
    【Java】java.util.Objects 源码学习
    【Spring-web】AsyncRestTemplate源码学习
    【Spring-web】RestTemplate源码学习——梳理内部实现过程
    【Spring-web】RestTemplate源码学习
  • 原文地址:https://www.cnblogs.com/wangph/p/9029625.html
Copyright © 2020-2023  润新知