自编数据库

需要上一编的支持: 

import os
import re
import shutil

if __name__ != '__main__':
    import Myku_MoKuai.ZSQL_FUZHU as gl
else:
    import ZSQL_FUZHU as gl


# 行列转换用于遍历
def TiQiLie(data: list[list]) -> list[list]:
    # 行长短不一补空
    Max = 0
    for j in data:
        if Max < len(j):
            Max = len(j)
    for j in range(len(data)):
        for k in range(Max - len(data[j])):
            data[j].append('')
    huang = []
    lie = []
    for k in range(len(data[0])):
        for j in range(len(data)):
            lie.append(data[j][k])
        huang.append(lie)
        lie = []
    return huang


MyData_path = os.getcwd()  # 获取工作文件夹地址
if not (os.path.exists(MyData_path + os.sep + 'MyData')):  # 判断工作文件夹下是否存在文件夹MyData
    os.mkdir(MyData_path + os.sep + 'MyData')  # 不存在进入创建文件夹
os.chdir(MyData_path + os.sep + 'MyData')
MyData_path = os.getcwd()


class Fu_JiaKou:  # 父类接口
    path_kb = ''  # 库或表的地址

    def work(self):
        pass

    # 提取表头 mose(模式)0['int','str','int'],1['姓名','年龄','身高'],2[['str','int','int'],['姓名','年龄','身高']]
    def BiaoTou(self, p: bool = False, mose: int = 1):
        if os.getcwd() != MyData_path:
            a = self.path_kb
            if os.path.exists(self.path_kb):
                zl = {'地址': self.path_kb, '命令': gl.QC, '属性': '表头'}
                lie_suxing: list = gl.Lnstructions(**zl)
                for i in range(len(lie_suxing)):
                    lie_suxing[i] = lie_suxing[i].split(':')
                if p:
                    lie_suxing.insert(0, ['int', '指针'])
                lie_suxing = TiQiLie(lie_suxing)
                match mose:
                    case 0:
                        return lie_suxing[0]
                    case 1:
                        return lie_suxing[1]
                    case 2:
                        return lie_suxing
                    case _:
                        return 'Error:函数BiaoTou()参数输入错误!'
            else:
                return 'Error:表不存在!'
        else:
            return 'Error:没进入库!'

    # p是数据是否带指针,weidu是输出的数据是一维还是二维    
    def Data_Zhong(self, p: bool = True, weidu: int = 2):  # 提取数据
        if os.getcwd() != MyData_path:
            if os.path.exists(self.path_kb):
                ml = {'地址': self.path_kb, '命令': gl.QC, 'p': p, '维度': weidu}
                return gl.Lnstructions(**ml)
            else:
                return 'Error:表不存在!'
        else:
            return 'Error:没进入库!'

    # 加工与或非运算式压入栈
    def __YiHuaFei_RZ(self, mling: str, num: int):
        # 去除小括号
        if '(' in mling and ')' in mling:
            mling = re.findall(r'\((.*?)\)', mling)[0]
        # 提取比较(>= <= != > < == )运算式
        zhan = re.findall(r'[\u4e00-\u9fa5\w\s]+[<>=!]{1,2}[\u4e00-\u9fa5\w\s]+', mling)
        if zhan:
            for i in zhan:
                mling = mling.replace(i, 'x' + str(num))
                num += 1
        # 提取逻辑“非”运算式
        cemp = re.findall(r'![\u4e00-\u9fa5\w\s]+', mling)
        if cemp:
            zhan = zhan + cemp
            for i in cemp:
                mling = mling.replace(i, 'x' + str(num))
                num += 1
        # 提取逻辑"||","&&"运算式
        while mling != 'x' + str(num - 1):
            # cemp = re.match(r'[\w]{2}[&|]{2}[\w]{2}',mling)
            cemp = re.match(r'x[0-9]+(\|\||&&)x[0-9]+', mling)
            if cemp is not None:
                cemp = cemp.group()
                zhan.append(cemp)
                mling = mling.replace(cemp, 'x' + str(num))
                if mling == 'x' + str(num):
                    break
                num += 1
        return zhan, num

    # 将条件运算语名压入栈
    def __ReZhan(self, mingling: str) -> list:
        num = 0
        zhan = []
        while re.findall(r'\([\u4e00-\u9fa5\w\s<>=!&|]+\)', mingling):
            cemp = re.findall(r'\([\u4e00-\u9fa5\w\s<>=!&|]+\)', mingling)
            for i in cemp:
                # 判断cemp的内容是否还要细分
                if re.findall(r'[!|&]{1,2}', i.replace('!=', '/=')):
                    zhancemp = self.__YiHuaFei_RZ(i, num)
                    zhan = zhan + zhancemp[0]
                    num = zhancemp[1]
                else:
                    zhan.append(re.findall(r'\((.*?)\)', i)[0])
                mingling = mingling.replace(i, 'x' + str(num))
                num += 1
        zhan = zhan + self.__YiHuaFei_RZ(mingling, num)[0]
        return zhan


    # 比较运算
    def __BiJiaoYunSuan(self, zl: str, dz: list, bt: list):  # dz是data_zhong,bt是biaotou
        # zl: list[str] = self.__BiJiaoFu(zl)
        for k in ['==', '!=', '<=', '>=', '<', '>']:
            if k in zl:
                zl = zl.replace(k, ' ' + k + ' ', 1)
                break
        zl = re.findall(r'[\u4e00-\u9fa5\w!<>=]+', zl)
        match zl[1]:
            case '==':
                return [j // len(bt) for j in range(bt.index(zl[0]), len(dz), len(bt)) if dz[j] == zl[2]]
            case '!=':
                return [j // len(bt) for j in range(bt.index(zl[0]), len(dz), len(bt)) if dz[j] != zl[2]]
            case '>=' | '<=' | '>' | '<':
                if type(dz[bt.index(zl[0])]) == int and zl[2].isdigit():
                    match zl[1]:
                        case '>=':
                            return [j // len(bt) for j in range(bt.index(zl[0]), len(dz), len(bt)) if
                                    dz[j] >= int(zl[2])]
                        case '<=':
                            return [j // len(bt) for j in range(bt.index(zl[0]), len(dz), len(bt)) if
                                    dz[j] <= int(zl[2])]
                        case '>':
                            return [j // len(bt) for j in range(bt.index(zl[0]), len(dz), len(bt)) if
                                    dz[j] > int(zl[2])]
                        case '<':
                            return [j // len(bt) for j in range(bt.index(zl[0]), len(dz), len(bt)) if
                                    dz[j] < int(zl[2])]
                else:
                    return 'Error:数据不是int无法进行大小比较'
            case _:
                return 'Error:比较符错误!'

    # 与或非运算
    def __YuHuaFei(self, buzhou: list):
        data_z = self.Data_Zhong(weidu=1)
        if 'Error:' in data_z:
            return data_z
        biaotou = self.BiaoTou(p=True)
        if 'Error:' in biaotou:
            return biaotou
        # 用于储存运算中产生的数据
        mling_data = []
        while buzhou:
            ml = buzhou.pop(0)
            # 判断是条件判断还是与或非运算
            if re.match(r'^[\u4e00-\u9fa5\w\s]+(!=|==|<=|>=|<|>)[\u4e00-\u9fa5\w\s]+$', ml) is not None:
                bijiao = self.__BiJiaoYunSuan(ml, data_z, biaotou)
                if 'Error:' in bijiao:
                    return bijiao
                mling_data.append(bijiao)
            else:
                if not mling_data:
                    return 'Error:没有匹配的数据!'
                num = re.findall(r'[0-9]+', ml)  # 提取命令中的编号
                match re.findall(r'[|&!]{1,2}', ml):
                    case ['&&']:
                        mling_data.append(list(set(mling_data[int(num[0])]) & set(mling_data[int(num[1])])))
                    case ['||']:
                        mling_data.append(list(set(mling_data[int(num[0])]) | set(mling_data[int(num[1])])))
                    case ['!']:
                        data = set([i for i in range(len(data_z))])
                        mling_data.append(list(data - set(mling_data[int(num[0])])))
                    case _:
                        return 'Error:与或非运算符错误!'
        if not mling_data:
            return 'Error:没有匹配的数据!'
        return mling_data[len(mling_data) - 1]

    # 行:'性名==小明||学号==123'
    # b = (i//3 for i in range(biaotou.index('年龄'), len(a1), len(biaotou)) if a1[i] == 12)
    def Huang(self, data_z: list[list], ml: str, data_y: str):
        # 步骤分解入栈
        buzhou = self.__ReZhan(ml)
        # 按步骤进行条件和与或非运算
        huang_y = self.__YuHuaFei(buzhou)
        if 'Error:' in huang_y:
            return huang_y
        if data_y == '数据':
            return [data_z[i] for i in range(len(data_z)) if i in huang_y]
        elif data_y == '坐标':
            return huang_y


class 显示库(Fu_JiaKou):  # 显示库();
    def work(self):
        return os.listdir(MyData_path)


class 进入库(Fu_JiaKou):  # 进入库(数据库名称);
    def __init__(self, name_kubiao) -> None:
        self.path_kb = MyData_path + os.sep + name_kubiao

    def work(self):
        os.chdir(MyData_path)
        if os.path.exists(self.path_kb):
            os.chdir(self.path_kb)
        else:
            return 'Error:库不存在!'


class 创建库(Fu_JiaKou):  # '创建库(数据库名称);'
    def __init__(self, name_kubiao) -> None:
        self.path_kb = MyData_path + os.sep + name_kubiao

    def work(self):
        if not (os.path.exists(self.path_kb)):
            os.mkdir(self.path_kb)
        else:
            return 'Error:库已存在!'


class 删除库(Fu_JiaKou):  # '删除库(数据库名称);'
    def __init__(self, name_kubiao) -> None:
        self.path_kb = MyData_path + os.sep + name_kubiao

    def work(self):
        if os.path.exists(self.path_kb):
            shutil.rmtree(self.path_kb)
        else:
            return 'Error' + self.path_kb + '库不存在无法删除!'


class 查看当前使用库(Fu_JiaKou):  # '查看当前使用库();'
    def work(self):
        if os.getcwd() != MyData_path:
            return os.path.basename(os.getcwd())
        else:
            return 'Error:没有进入库!'


class 显示表(Fu_JiaKou):  # '显示表();'
    def work(self):
        return os.listdir(os.getcwd())


class 删除表(Fu_JiaKou):  # '删除表(表名称);'
    def __init__(self, name_kubiao) -> None:
        self.path_kb = os.getcwd() + os.sep + name_kubiao

    def work(self):
        if MyData_path != os.getcwd():
            if os.path.exists(self.path_kb):
                shutil.rmtree(self.path_kb)
            else:
                return 'Error:' + self.path_kb + '表不存在无法删除'
        else:
            return 'Error:没有进入库!'


class 创建表(Fu_JiaKou):  # "创建表('二年级考试成绩表',['str:姓名','str:性别','str:学号','int:语文','int:数学','int:英语'],'utf8')"
    def __init__(self, name_kubiao, data: list, encoding='utf8') -> None:
        self.path_kb = os.getcwd() + os.sep + name_kubiao
        encoding = encoding + ' ' * (18 - len(encoding))
        data.insert(0, encoding)
        self.data = data

    def work(self):
        if os.getcwd() != MyData_path:
            if not (os.path.exists(self.path_kb)):
                os.mkdir(self.path_kb)
                ml = {'地址': self.path_kb, '命令': gl.CR, '属性': self.data}
                gl.Lnstructions(**ml)
            else:
                return 'Error:表已存在!'
        else:
            return 'Error:没有选择库无法创建!'


class 插入数据(Fu_JiaKou):  # '插入数据(表名){(列1, 列2,列N),(值1, 值2, 值N),(值1, 值2, 值N)}'
    data = list()

    def __init__(self, name_kubiao, data) -> None:
        self.path_kb = os.getcwd() + os.sep + name_kubiao
        for i in data:
            self.data.append(list(i))

    def work(self):
        data = list()
        data_biaotou = self.data[0]
        biaotou = self.BiaoTou(mose=2)
        if 'Error:' not in biaotou:
            # 判断插入数据的表头是否表头的子集
            k = 0
            for i in data_biaotou:
                if i in biaotou[1]:
                    k += 1
            if k != len(data_biaotou):
                return 'Error:插入的数据有误!'
            # 插入空与排序
            chare_data_suliang = len(self.data) - 1
            self.data = TiQiLie(self.data)
            for i in range(len(biaotou[1])):
                if biaotou[1][i] in data_biaotou:  # 检查有没有这条数据
                    for k in self.data:
                        if biaotou[1][i] == k[0]:  # 确定这条数据的位置
                            # 判断r插入的数据类型是否与表头对应
                            num = 0
                            for j in k[1:len(k)]:
                                if type(j) == eval(biaotou[0][i]):
                                    num += 1
                            if num != len(k) - 1:
                                return 'Error:插入数据类型与列类型不匹配!'

                            data.append(k[1:len(k)])
                            break
                else:
                    data.append(re.findall(r'NONONE', 'NONONE' * chare_data_suliang))
        else:
            return biaotou
        self.data = data
        del data
        del data_biaotou
        self.data = TiQiLie(self.data)
        # 判断库中是否有相同的数据有就不插入        
        data_z = self.Data_Zhong(p=False)
        if 'Error:' not in data_z:
            n = 0
            while n < len(self.data):
                if self.data[n] in data_z:
                    self.data.pop(n)
                    n -= 1
                n += 1
        del data_z
        if self.data:
            ml = {'地址': self.path_kb, '命令': gl.CR, '数据': self.data}
            gl.Lnstructions(**ml)


class 删除数据(Fu_JiaKou):  # '删除数据(表名){行:(id != 123 && id != 25)}'
    def __init__(self, name_kubiao, data) -> None:
        self.path_kb = os.getcwd() + os.sep + name_kubiao
        self.data = data

    def work(self):
        data_z = self.Data_Zhong()
        if 'Error:' in data_z:
            return data_z
        if self.data.get('行', None) is not None:
            huang_san = self.Huang(data_z, self.data['行'], '数据')
            # 如果报错直接退出并返回错误
            if 'Error:' in huang_san:
                return huang_san
        else:
            huang_san = data_z
        # 查找的内容为空不进行删除
        if huang_san:
            huang_san_p = [i[0] for i in huang_san]  # 在数据中提取指针
            ml = {'地址': self.path_kb, '命令': gl.SC, '数据': huang_san_p}
            gl.Lnstructions(**ml)


class 更新数据(Fu_JiaKou):  #"更新数据('二年级考试成绩表',{'行':'id != 123 && id != 25', '列':{'列1':'n1','列2':'n2','列3':'n3'}})"
    def __init__(self, name_kubiao, data: dict) -> None:
        self.path_kb = os.getcwd() + os.sep + name_kubiao
        self.data = data

    def work(self):
        if self.data.get('列', None) is None:
            return 'Error:列的指令错误!'
        self.data['列'] = self.data['列'].split(',')
        huang_gengxing = self.Data_Zhong()
        if 'Error:' in huang_gengxing:
            return huang_gengxing
        # 计算出要更新的数据
        if self.data.get('行', None) is not None:  # 如果指令中没有行就全选
            huang_gengxing = self.Huang(huang_gengxing, self.data['行'], '数据')
            # 如果报错直接退出并返回错误
            if 'Error:' in huang_gengxing:
                return huang_gengxing
       
        # 将列数据插入要更新的数据中
        biaotou = self.BiaoTou(p=True, mose=1)
        if 'Error:' in biaotou:
            return biaotou
        for j in range(len(huang_gengxing)):
            for k in self.data['列']:
                num = biaotou.index(k)
                if type(huang_gengxing[j][num]) is int:
                    if not (self.data['列'][k].isdigit()):
                        return 'Error:更新类型不匹配!'
                    huang_gengxing[j][num] = int(self.data['列'][k])
                else:
                    huang_gengxing[j][num] = self.data['列'][k]
        zl = {'地址': self.path_kb, '命令': gl.GX, '数据': huang_gengxing}
        gl.Lnstructions(**zl)


# "查找统计('二年级考试成绩表',{'查找':{'行':'性别==男','列':'xx,xx',''},'统计':{'属性':'行,语文,数学,英语','函数':'求和,平均值'}})"
class 查找统计(Fu_JiaKou):
    def __init__(self, name_kubiao, data: dict) -> None:
        self.biaotou = None
        self.path_kb = os.getcwd() + os.sep + name_kubiao
        self.ml_dict = data

    def work(self):
        data_chazhao: list = self.Data_Zhong(p=False)
        if 'Error:' in data_chazhao:
            return data_chazhao
        data_tongji = data_chazhao.copy()

        self.biaotou = self.BiaoTou(p=False)
        if 'Error:' in self.biaotou:
            return self.biaotou
        chazhao_b = False
        tongji_b = False

        # 查找计算
        if self.ml_dict.get('查找', None) is not None:  # 判断是否有查找
            chazhao_b = True
            if self.ml_dict['查找'] != {}:  # 判断查找是否空
                data_chazhao = self.__ChaZhao(data_chazhao)
                if 'Error:' in data_chazhao:
                    return data_chazhao
            if self.biaotou != data_chazhao[0] and len(self.biaotou) == len(data_chazhao[0]):
                data_chazhao.insert(0, self.biaotou)
        else:
            del data_chazhao
        # 统计计算
        if self.ml_dict.get('统计', None) is not None:  # 判断是否有统计
            tongji_b = True
            if self.ml_dict['统计'] != {}:  # 判断统计是否空
                if self.ml_dict.get('查找', None) is None:  # 判断是否有查找
                    self.ml_dict['查找'] = {}
                self.ml_dict['查找']['列'] = self.ml_dict['统计']['属性'][2:len(self.ml_dict['统计']['属性'])]
                data_tongji_su = self.__ChaZhao(data_tongji)
                data_tongji = self.__TongJi(data_tongji_su)
                if 'Error:' in data_tongji:
                    return data_tongji
                if self.ml_dict['统计']['属性'][:1] == '行':
                    data_tongji = TiQiLie(data_tongji)
        else:
            del data_tongji

        if chazhao_b is True and tongji_b is False:
            return data_chazhao
        elif chazhao_b is False and tongji_b is True:
            return data_tongji
        elif chazhao_b is True and tongji_b is True:
            # 查找与统计的智能粘合      
            if self.ml_dict['统计']['属性'][:1] == '行':
                for i in range(len(data_chazhao)):
                    data_chazhao[i] = data_chazhao[i] + data_tongji[i]
            else:
                for i in range(len(data_chazhao)):
                    data_chazhao[i] = data_chazhao[i] + data_tongji_su[i]
                data_chazhao.append(data_tongji)
            return data_chazhao
        elif chazhao_b == False and tongji_b == False:
            return 'Error:错误!'

    ###################################### 查找 ###################################
    # 查找
    def __ChaZhao(self, data_chazhao: list[list]):
        if self.ml_dict.get('查找', None) is not None:
            chazhao_dict = self.ml_dict['查找']
            # 删除重插保证列在后面,列不在后面运行会出错
            if chazhao_dict.get('列', None) is not None:
                chazhao_dict['列'] = chazhao_dict.pop('列')
        for i in chazhao_dict:
            match i:
                case '行':
                    data_chazhao = self.Huang(data_chazhao, chazhao_dict[i], '数据')
                case '列':
                    data_chazhao = self.__ChaZhao_Lie(data_chazhao, chazhao_dict[i], True)
                case '!列':
                    data_chazhao = self.__ChaZhao_Lie(data_chazhao, chazhao_dict[i], False)
                case '包含':
                    data_chazhao = self.__ChaZhao_BaoHan(data_chazhao, chazhao_dict[i])
                case _:
                    return 'Error:查找命令格式错误!'
            if 'Error:' in data_chazhao:
                return data_chazhao
        return data_chazhao

    # 查找列
    def __ChaZhao_Lie(self, data_z: list, ml: str, b: bool):
        ml = ml.split(',')
        if b:
            ml = [i for i in self.biaotou if i not in ml]
        data_z.insert(0, self.biaotou)  # 插入表头
        data_z = TiQiLie(data_z)
        for i in range(len(ml)):
            for k in range(len(data_z)):
                if ml[i] == data_z[k][0]:
                    data_z.pop(k)
                    break
        data_z = TiQiLie(data_z)
        return data_z

    # 查找包含,对数字无效例:[无名,小白,五天,一白]子集(白,姓名)可以找出[小白,一白]  
    def __ChaZhao_BaoHan(self, data_z: list, ml: str) -> str | list:  # 查找函数'子集'在选出的行列中找出数据包含xx的数据用in判断
        ml = ml.split(',')
        if ml[0] in self.biaotou:
            num = self.biaotou.index(ml[0])
            n = 0
            while n < len(data_z):
                if type(data_z[n][num]) == str:
                    if ml[1] not in data_z[n][num]:
                        data_z.pop(n)
                        n -= 1
                else:
                    return 'Error:不是str类型无法进行包含运算!'                    
                n += 1
        else:
            return 'Error:所查的数据不存%s这一列!' % (ml[0])
        return data_z

    ##################################### 统计 ###################################
    def __TongJi(self, data_tongji: list):
        if self.ml_dict.get('统计', None) is not None:
            tongji_dict = self.ml_dict['统计']

        hansu = tongji_dict['函数'].split(',')
        zes = list()
        for i in hansu:
            match i:
                case '求和':
                    ze = self.__TongJi_QiuHe(data_tongji, tongji_dict['属性'], '和')
                case '平均值':
                    ze = self.__TongJi_QiuHe(data_tongji, tongji_dict['属性'], '平均值')
                case '最大值':
                    ze = self.__TongJi_MaxMin(data_tongji, '最大值')
                case '最小值':
                    ze = self.__TongJi_MaxMin(data_tongji, '最小值')
                case '数量':
                    ze = self.__TongJi_SuLiang(data_tongji)
                case _:
                    return 'Error:统计命令格式错误!'
            if 'Error:' in ze:
                return ze
            zes.append(ze)
        return zes

    def __TongJi_QiuHe(self, data_tongji: list, ml: str, s: str) -> str | list[str | int | float]:  # 求和/平均值
        ml = ml.split(',')
        if ml[0] == '列':
            data_tongji = TiQiLie(data_tongji)
        ze = [s]
        for i in range(1, len(data_tongji)):
            he = 0
            for k in data_tongji[i]:
                if type(k) != int:
                    return 'Error:类型不是int无法相加!'
                he += k
            if s == '和':
                ze.append(he)
            else:
                ze.append(round(he / len(data_tongji[i]), 3))
        return ze

    def __TongJi_MaxMin(self, data_tongji: list, s):
        Max_Min_s = [s]
        for i in data_tongji:
            num = 0
            for k in i:
                if type(k) == int:
                    num += 1
            if num != len(i):
                return 'Error:数据存在不是int类型数据无法比较大小值!'
            if s == '最大值': Max_Min = max(i)
            if s == '最小值': Max_Min = min(i)
            Max_Min_s.append(Max_Min)
        return data_tongji

    def __TongJi_SuLiang(self, data_tong: list):
        if not data_tong:
            return 0
        else:
            return len(data_tong[0])


def MingLing(ml):
    return ml.work()

def ZhengXing(MLS: str):
    zl = re.match(r'([\u4e00-\u9fa5]+)\(',MLS)
    if zl is None:
        return 'Error:命令错误!'
    XiaoKua_JiaoYan = lambda a: re.match(r'^[\u4e00-\u9fa5]+\(\'[\u4e00-\u9fa5\w]+\'\)$',a)
    del_kongge = lambda a: re.sub(r'\s+', '', a)
    match zl.group(1):
        case '显示库'|'显示表'|'查看当前使用库':
            MLS = del_kongge(MLS)
            if re.match(r'^[\u4e00-\u9fa5]+\(\)$'):
                return f'Error:命令{MLS}书写格式错误!'
            
        case '进入库'|'创建库'|'删除库'|'删除表':
            MLS = del_kongge(MLS)
            if XiaoKua_JiaoYan(MLS) is None:
                return f'Error:命令{MLS}书写格式错误!'
                
        #a1 = "创建表('二年级考试成绩表',['str:姓名','str:性别','str:学号','int:语文','int:数学','int:英语'])"
        #"插入数据('二年级考试成绩表',[('姓名','性别','数学','英语','语文','学号'),('恩\'恩','女',88,85,67,'1'),('小\'明','男',89,70,81,'2')])"
        case '创建表'|'插入数据':
            data = re.search(r"\,\ ?(\[.+\])",MLS)
            if data is None:
                return f'Error:命令{MLS}" ,[] "位置书写格式错误!'
            try:
                data = eval(data.group(1))
            except:
                return f'Error:命令{MLS}" [] "书写内容格式错误!'
            for i in range(len(data)):
                if zl.group(1) == '创建表':
                    if type(data[i]) == str:
                        if re.match(r'^(str|int):[\u4e00-\u9fa5\w]+$',data[i]) is None:
                            return f'Error:命令 {data[i]} 书写格式错误!'
                    else:
                        return f'Error:命令 {data[i]} 书写格式错误!'
                else: # 插入数据
                    if i == 0:
                        for j in data[i]:
                            if type(j) == str:
                                if re.match(r'^[\u4e00-\u9fa5\w]+$',j) is None:
                                    return f'Error:命令 {j} 书写格式错误!'
                            else:
                                return f'Error:命令 {j} 书写格式错误!'
                    else:
                        if len(data[i]) != len(data[0]):
                            return f'Error:命令的数据列数与表头不一致!'
                        for j in data[i]:
                            if type(j) not in [str, int, float]:
                                return f'Error:命令 {j} 书写格式错误!'
            mls = re.sub(r'\,\[.+\]', '', MLS)
            mls = del_kongge(mls)
            if XiaoKua_JiaoYan(mls) is None:
                return f'Error:命令{MLS}" xxx(\'xxx\') "书写格式错误!'
            
        #a3 = "删除数据('二年级考试成绩表',{'行':'姓名==恩恩'})"
        #a4 = "更新数据('二年级考试成绩表',{'行':'id != 123 && id != 25', '列':{'列1':'n1','列2':'n2','列3':'n3'}})"
        #a7 = "查找统计('二年级考试成绩表',{'查找':{'行':'姓名==恩恩','包含':'姓名,明','列':'姓名,性别'},'统计':{'属性':'行,语文,数学,英语','函数':'求和,平均值'}})"
        case '删除数据'|'更新数据'|'查找统计':
           
            data = re.search(r"\,(\{.+\})",MLS)
            if data is None:
                return 'Error:命令{MLS}" ,\{\} "书写内容格式错误!'.format(MLS)
            try:
                data: dict = eval(data.group(1))
            except:
                return 'Error:命令{MLS}" \{\} "书写内容格式错误!'.format(MLS)
            for i in data:
                if i is not '列':
                    MLS = del_kongge(data[i])
                if zl.group(1) == '删除数据' or zl.group(1) == '更新数据':
                    if i is "行":
                        if re.match(r'^\(*\!?[\w\u4e00-\u9fa5]+(\<|\>|\<\=|\>\=|\=\=|\!\=){1}[\w\u4e00-\u9fa5]+\)*((\&\&|\|\|){1}\(*\!?[\w\u4e00-\u9fa5]+(\<|\>|\<\=|\>\=|\=\=|\!\=){1}[\w\u4e00-\u9fa5]+\)*)*$',data[i]) is None:
                            return f'Error:命令 {data[i]} 书写格式错误!'
                    elif i is "列":
                        for j in data[i]:
                            if re.match(r'^[\u4e00-\u9fa5\w]+$',j) is None:
                                return f'Error:命令 {j} 书写格式错误!'
                            if data[i][j] is '':
                                return f'Error:命令 {j} = 空 书写格式错误!'
                    else:
                        return f'Error:命令 {i} 书写格式错误!'
                else: # 查找统计
                    if type(data[i]) != dict:
                        return f'Error:命令 {data[i]} 不是字典类型书写格式错误!'
                    if i is "查找":
                        for j in data[i]:
                            if j is "行":
                                if re.match(r'^\(*\!?[\w\u4e00-\u9fa5]+(\<|\>|\<\=|\>\=|\=\=|\!\=){1}[\w\u4e00-\u9fa5]+\)*((\&\&|\|\|){1}\(*\!?[\w\u4e00-\u9fa5]+(\<|\>|\<\=|\>\=|\=\=|\!\=){1}[\w\u4e00-\u9fa5]+\)*)*$',data[i][j]) is None:
                                    return f'Error:命令 {data[i][j]} 书写格式错误!'
                            elif j is "包含":
                                if re.match(r'^[\u4e00-\u9fa5\w]+,[\u4e00-\u9fa5\w]+$',data[i][j]) is None:
                                    return f'Error:命令 {data[i][j]} 书写格式错误!'
                            elif j is "列":
                                if re.match(r'^[\u4e00-\u9fa5\w]+(,[\u4e00-\u9fa5\w]+)*$',data[i][j]) is None:
                                    return f'Error:命令 {data[i][j]} 书写格式错误!'
                            else:
                                return f'Error:命令 {j} 书写格式错误!'
                    elif i is "统计":
                        tongji_b = [False, False]  # 用于判断统计命令是否有统计属性和函数
                        for j in data[i]:
                            if j is "属性":
                                tongji_b[0] = True
                                if re.match(r'^(行|列)[\u4e00-\u9fa5\w]+(,[\u4e00-\u9fa5\w]+)*$',data[i][j]) is None:
                                    return f'Error:命令 {data[i][j]} 书写格式错误!'
                            elif j is "函数":
                                tongji_b[1] = True
                                if re.match(r'^(求和|平均值|最大值|最小值|数量)[\u4e00-\u9fa5\w]*(,[\u4e00-\u9fa5\w]+)*$',data[i][j]) is None:
                                    return f'Error:命令 {data[i][j]} 书写格式错误!'
                            else:
                                return f'Error:命令 {j} 书写格式错误!'
                            if not (tongji_b[0] and tongji_b[1]):
                                return f'Error:命令 " 统计中缺少属性或函数 " 书写格式错误!'
                    else:
                        return f'Error:命令 {i} 书写格式错误!'
                    
            mls = re.sub(r'\,\{.+\}', '', MLS)
            if XiaoKua_JiaoYan(mls) is None:
                return f'Error:命令{MLS}" xxx(\'xxx\') "书写格式错误!'
        case _:
            return 'Error:命令错误!'
    return MingLing(eval(MLS))

使用方法: 

import Myku_MoKuai.ZSQL as mk
a1 = "创建库('函数库')"
a3 = "进入库('函数库')"
a2 = "创建表('python函数',['str:模块名','str:函数名','str:函数描述','str:参数列表','str:返回值','str:示例代码'])"
a4 = """插入数据('python函数',[('模块名','函数名','函数描述','参数列表','返回值','示例代码'),
    ('math','math.fabs(number)','返回绝对值','float','float','math.sqrt(x)'),
    
    ])"""
a5 = "查找统计('python函数',{'查找':{'包含':'函数描述,绝对值'}})"
a6 = "删除数据('python函数',{'行':'模块名!=math&&模块名!=str'})"
zl = [a3,a4]
for i in zl:
    data = mk.ZhengXing(i)
    if type(data) == list:
        for j in data:
            print(j)
    else:
        print(data)

不完善,请大家指导一下.

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

火龙果738

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值