需要上一编的支持:
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)
不完善,请大家指导一下.