简单的类数据库查询语句编写

def getLine(filename):
    with open(filename,encoding='utf-8') as f:
        tittle = f.readline().strip()
        tittle = tittle.split(',')
        # print(tittle)
        for i in f:
            dic = {}
            i = i.strip().split(',')
            print(i)
            for mem in range(len(tittle)):
                dic[tittle[mem]] = i[mem]
            # print(dic)
            #可以直接用生成器
            yield dic

def input_pharse(s):
    """
    解析s,返回字典,{'字段':[],'条件':[]}
    """

    data = s.split('select')
    if len(data) != 2:
        return {'error':'not fit format'}
    #data[1]是字段和条件的字符串
    data = data[1].split('where')
    if len(data) != 2:
        return {'error': 'do not contain field,or condition'}
    print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~',data[0])
    data[0].replace(' ','')
    print('~~~~~!!!!~~~~~~~~~~~~~~~', data[0])
    field = data[0].split(',')
    condition = data[1].split('and')
    # for c in condition:
    #     print(c.split(' '))
    dic = {}
    dic.setdefault('field',field)
    dic.setdefault('condition',condition)
    return dic

def ret_input():
    #inp = input('>>>')
    inp = 'select * where job == it and age >= 24'
    filename = 'users'
    pharse_ret = input_pharse(inp)
    # print(pharse_ret)
    field = pharse_ret['field']
    conditon = pharse_ret['condition']
    print(field)
    print(conditon)

    g_table = getLine(filename)
    ret = []
    for ite in g_table:
        # print(type(ite),ite)
        for i in conditon:
            print(i)
            if '>=' in i:
                col,val = i.strip().split('>=')
                if ite[col.strip()].strip().upper() >= val.strip().upper():
                    if ite not in ret:
                        ret.append(ite)
                else:
                    if ite in ret:
                        ret.remove(ite)
                    break  # 跳出条件循环
            elif '<=' in i:
                col,val = i.strip().split('<=')
                if ite[col.strip()].strip().upper() <= val.strip().upper():
                    if ite not in ret:
                        ret.append(ite)

                elif ite in ret :
                    ret.remove(ite)
            elif '>' in i :
                col,val = i.strip().split('>')
                if ite[col.strip()].strip().upper() > val.strip().upper():
                    if ite not in ret:
                        ret.append(ite)
                else:
                    if ite in ret:
                        ret.remove(ite)
                    break  # 跳出条件循环
            elif '<' in i:
                col,val = i.strip().split('<')
                if ite[col.strip()].strip().upper() < val.strip().upper():
                    if ite not in ret:
                        ret.append(ite)
                        print('one fit')
                else:
                    if ite in ret:
                        ret.remove(ite)
                    break  # 跳出条件循环
            elif '==' in i:
                col,val = i.strip().split('==')
                if ite[col.strip()].strip().upper() == val.strip().upper():
                    if ite not in ret:
                        ret.append(ite)
                        print("fit one ",ret)
                else:
                    if ite in ret :
                        print('no fit all')
                        ret.remove(ite)
                    break#跳出条件循环
            else:
                return 'error in condition'
            print(col,val)
    print(ret)
    print(type(field),field)
    for index in range(len(ret)):
        temp_dic = {}
        for i in field:
            if '*' not in i.strip():
                temp_dic[i.strip()] = ret[index][i.strip()]
                ret[index] = temp_dic
            else:
                break
    else:
        print('all')
    print('!!!!',ret)

ret_input()

  

猜你喜欢

转载自www.cnblogs.com/cellking-xdb/p/11057056.html
今日推荐