diff --git a/工具v4/database_tools_2.py b/工具v4/database_tools_2.py index 26a787a5..e04dd087 100644 --- a/工具v4/database_tools_2.py +++ b/工具v4/database_tools_2.py @@ -117,11 +117,11 @@ def findsru(id,alist): #在same_list中寻找与id相同的题号 def findsameinDB(id,database): #在数据库中寻找与id相同的题号 mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - sql = "SELECT SAME_ID FROM same WHERE ID = (%s);" + sql = "SELECT SAME_ID FROM same WHERE ID = (%s) AND NOT obsolete;" val = (id,) mycursor.execute(sql,val) set1 = set([ret[0] for ret in mycursor.fetchall()]) - sql = "SELECT ID FROM same WHERE SAME_ID = (%s);" + sql = "SELECT ID FROM same WHERE SAME_ID = (%s) AND NOT obsolete;" mycursor.execute(sql,val) set2 = set([ret[0] for ret in mycursor.fetchall()]) return sorted(list(set1 | set2)) @@ -129,11 +129,11 @@ def findsameinDB(id,database): #在数据库中寻找与id相同的题号 def findrelatedinDB(id,database): #在数据库中寻找与id关联的题号 mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - sql = "SELECT RELATED_ID FROM related WHERE ID = (%s);" + sql = "SELECT RELATED_ID FROM related WHERE ID = (%s) AND NOT obsolete;" val = (id,) mycursor.execute(sql,val) set1 = set([ret[0] for ret in mycursor.fetchall()]) - sql = "SELECT ID FROM related WHERE RELATED_ID = (%s);" + sql = "SELECT ID FROM related WHERE RELATED_ID = (%s) AND NOT obsolete;" mycursor.execute(sql,val) set2 = set([ret[0] for ret in mycursor.fetchall()]) return sorted(list(set1 | set2)) @@ -141,7 +141,7 @@ def findrelatedinDB(id,database): #在数据库中寻找与id关联的题号 def get_unit_tags(id,database): mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - sql = "SELECT tagname FROM tagcorresp WHERE ID = (%s);" + sql = "SELECT tagname FROM tagcorresp WHERE ID = (%s) AND NOT obsolete;" val = (id,) mycursor.execute(sql,val) unittags = [ret[0] for ret in mycursor.fetchall() if "单元" in ret[0]] @@ -151,10 +151,14 @@ def get_unit_tags(id,database): def get_problem_content(id,database): mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - sql = "SELECT content FROM problems WHERE ID = (%s);" + sql = "SELECT content FROM problems WHERE ID = (%s) AND NOT obsolete;" val = (id,) mycursor.execute(sql,val) - content = mycursor.fetchall()[0][0] + ret = mycursor.fetchall() + if len(ret) == 0: + return "题目已作废" + else: + content = ret[0][0] mydb.close() return content @@ -162,7 +166,7 @@ def get_problem_content(id,database): def generate_same_list(database): mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - mycursor.execute("SELECT ID,SAME_ID FROM same;") + mycursor.execute("SELECT ID,SAME_ID FROM same WHERE NOT obsolete;") same_list = [(ret[0],ret[1]) for ret in mycursor.fetchall()] mydb.close() return same_list.copy() @@ -170,7 +174,7 @@ def generate_same_list(database): def generate_related_list(database): mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - mycursor.execute("SELECT ID,RELATED_ID FROM related;") + mycursor.execute("SELECT ID,RELATED_ID FROM related WHERE NOT obsolete;") related_list = [(ret[0],ret[1]) for ret in mycursor.fetchall()] mydb.close() return related_list.copy() @@ -179,7 +183,7 @@ def treat_dict(database): #对整个题库字典中的内容部分进行预处 treated_dict = {} mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - mycursor.execute("SELECT ID,content FROM problems;") + mycursor.execute("SELECT ID,content FROM problems WHERE NOT obsolete;") p_dict = {id:content for id,content in mycursor.fetchall()} # mycursor.execute("SELECT ID,SAME_ID FROM same;") # same_list = [(ret[0],ret[1]) for ret in mycursor.fetchall()] @@ -363,6 +367,9 @@ def usedIDs(database_name): #返回已使用题号, 已更新为适合mariadb的 start = interval[0] end = interval[-1] output += "首个已使用id: %s, 直至: %s"%(str(start).zfill(6),str(end).zfill(6)) + "\n" + mycursor.execute("SELECT ID FROM problems WHERE obsolete;") + idlist = [ret[0] for ret in mycursor.fetchall()] + output += f"\n已作废题号: {generate_exp(idlist)}" output = output.strip() mydb.close() return output #返回的是一个多行的字符串, 每一行中含有一个已使用题号的闭区间 @@ -686,7 +693,7 @@ def CreateRelatedProblems(links,database): # 根据links关联生成待编辑的 output = "\\begin{enumerate}\n" mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - sql = "SELECT content FROM problems WHERE ID = %s;" + sql = "SELECT content FROM problems WHERE ID = %s AND NOT obsolete;" for id,rid in links: val = (id,) mycursor.execute(sql,val) @@ -926,7 +933,7 @@ def AppendUsageData2024(prodict,field_id_and_content): def generateUsageList(db,id): mycursor = db.cursor() - mycursor.execute("SELECT date,classname,diff FROM usages WHERE ID = %s;",(id,)) + mycursor.execute("SELECT date,classname,diff FROM usages WHERE ID = %s AND NOT obsolete;",(id,)) tuplelist = mycursor.fetchall() return tuplelist @@ -951,9 +958,9 @@ def ImportMetadata(db,metadatafilepath): #metadata自动修改, 根据字段自 startdate = GetDate() starttime = GetTime() pendingusagelist = [] - mycursor.execute("SELECT ID FROM problems;") + mycursor.execute("SELECT ID FROM problems WHERE NOT obsolete;") id_list_in_DB = [ret[0] for ret in mycursor.fetchall()] - mycursor.execute("SELECT objid FROM lessonobj;") + mycursor.execute("SELECT objid FROM lessonobj WHERE NOT obsolete;") obj_list_in_DB = [ret[0] for ret in mycursor.fetchall()] data_to_modify = ObtainDatatoModify(metadatafilepath,fieldsdict,id_list_in_DB) print(data_to_modify) @@ -997,7 +1004,7 @@ def ImportMetadata(db,metadatafilepath): #metadata自动修改, 根据字段自 def overwriteinDB(mydb,field,id,content_string): #覆盖ans,solution,space字段的内容并在logs中记录 mycursor = mydb.cursor() - sql = f"SELECT {field} FROM problems WHERE ID = %s;" + sql = f"SELECT {field} FROM problems WHERE ID = %s AND NOT obsolete;" val = (id,) mycursor.execute(sql,val) original_string = mycursor.fetchall()[0][0] @@ -1015,7 +1022,7 @@ def mutualappendinDB(mydb,field,id,content_string,idlist): #新增same,related,u smallid = min(id,id2) bigid = max(id,id2) if smallid in idlist and bigid in idlist: - sql = f"SELECT ID, {field.upper()}_ID from {field} WHERE ID = %s AND {field.upper()}_ID = %s;" + sql = f"SELECT ID, {field.upper()}_ID from {field} WHERE ID = %s AND {field.upper()}_ID = %s AND NOT obsolete;" val = (smallid,bigid) mycursor.execute(sql,val) ret_list = mycursor.fetchall() @@ -1036,7 +1043,7 @@ def objappendinDB(mydb,id,content_string,objlist): #新增obj对应 if not objid in objlist: print(f"{objid} 有误, 请检查!!!") else: - sql = f"SELECT ID, obj_ID FROM objcorresp WHERE ID = %s AND obj_ID = %s;" + sql = f"SELECT ID, obj_ID FROM objcorresp WHERE ID = %s AND obj_ID = %s AND NOT obsolete;" val = (id,objid) mycursor.execute(sql,val) ret_list = mycursor.fetchall() @@ -1053,7 +1060,7 @@ def tagappendinDB(mydb,id,content_string): #新增tag对应 mycursor = mydb.cursor() content_list = [item.strip() for item in content_string.split("\n") if not item.strip() == ""] for tag in content_list: - sql = f"SELECT ID, tagname FROM tagcorresp WHERE ID = %s AND tagname = %s;" + sql = f"SELECT ID, tagname FROM tagcorresp WHERE ID = %s AND tagname = %s AND NOT obsolete;" val = (id,tag) mycursor.execute(sql,val) ret_list = mycursor.fetchall() @@ -1069,7 +1076,7 @@ def remarkappendinDB(mydb,id,content_string): #新增备注 content_list = [item.strip() for item in content_string.split("\n") if not item.strip() == ""] for line in content_list: date,remark = parseRemark(line) - sql = f"SELECT ID,date,remark_content FROM remarks WHERE ID = %s AND date = %s AND remark_content LIKE %s;" + sql = f"SELECT ID,date,remark_content FROM remarks WHERE ID = %s AND date = %s AND remark_content LIKE %s AND NOT obsolete;" val = (id,date,"%"+remark+"%") mycursor.execute(sql,val) ret_list = mycursor.fetchall() @@ -1114,7 +1121,7 @@ def usageappendinDB(mydb,id,content_string): #新增使用记录 date = rec["date"] classname = rec["classid"] diff = rec["difficulties"] - sql = f"SELECT ID,date,classname,diff FROM usages WHERE ID = %s and classname = %s;" + sql = f"SELECT ID,date,classname,diff FROM usages WHERE ID = %s and classname = %s AND NOT obsolete;" val = (id,classname) mycursor.execute(sql,val) oldusage_list = mycursor.fetchall() @@ -1277,7 +1284,7 @@ def GetSamePairs(prodict): #获取已标注的相同题目组 def ShareSameUsagesinDB(id1,id2,db): #有问题, 待修改 mycursor = db.cursor() - sql = "SELECT date,classname,diff FROM usages WHERE ID = (%s);" + sql = "SELECT date,classname,diff FROM usages WHERE ID = (%s) AND NOT obsolete;" val = (id1,) mycursor.execute(sql,val) id1_usages_list = mycursor.fetchall() @@ -1365,27 +1372,27 @@ def MatchConditioninMariaDB(condition_list,database): } mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - mycursor.execute("SELECT ID FROM problems WHERE NOT content REGEXP 'OBS';") + mycursor.execute("SELECT ID FROM problems WHERE NOT obsolete;") match = set([u[0] for u in mycursor.fetchall()]) for field,reverse,regexp in condition_list: if not field in ["same","related","usages"]: table,column = corr_dict[field] - sql = f"SELECT ID FROM {table} WHERE {column} REGEXP '{regexp}';" + sql = f"SELECT ID FROM {table} WHERE {column} REGEXP '{regexp}' AND NOT obsolete;" mycursor.execute(sql) newmatch = set([u[0] for u in mycursor.fetchall()]) elif field in ["same","related"]: table,col0,col1 = corr_dict[field] - sql1 = f"SELECT {col1} FROM {table} WHERE {col0} REGEXP '{regexp}';" + sql1 = f"SELECT {col1} FROM {table} WHERE {col0} REGEXP '{regexp}' AND NOT obsolete;" mycursor.execute(sql1) newmatch = set([u[0] for u in mycursor.fetchall()]) - sql2 = f"SELECT {col0} FROM {table} WHERE {col1} REGEXP '{regexp}';" + sql2 = f"SELECT {col0} FROM {table} WHERE {col1} REGEXP '{regexp}' AND NOT obsolete;" mycursor.execute(sql2) newmatch = newmatch | set([u[0] for u in mycursor.fetchall()]) elif field == "usages": table,cols = corr_dict[field][0],corr_dict[field][1:] newmatch = set([]) for i in range(len(cols)): - sql = f"SELECT ID FROM {table} WHERE {cols[i]} REGEXP '{regexp}';" + sql = f"SELECT ID FROM {table} WHERE {cols[i]} REGEXP '{regexp}' AND NOT obsolete;" mycursor.execute(sql) newmatch = newmatch | set([u[0] for u in mycursor.fetchall()]) if reverse: @@ -1643,36 +1650,39 @@ def generateDictsfromMariaDB(mycursor): for ret in tqdm.tqdm(ret_list,desc="生成题目字典"): pro_dict[ret[0]] = {"id": ret[0], "content": ret[1], "ans": ret[2], "solution": ret[3], "genre": ret[4], "duration": ret[5], "origin": json.loads(ret[6]), "space": ret[7]} - sql = "SELECT * FROM objcorresp;" #生成objs + sql = "SELECT * FROM objcorresp WHERE NOT obsolete;" #生成objs mycursor.execute(sql) ret_list = mycursor.fetchall() for id in pro_dict: pro_dict[id]["objs"] = [] # print("生成目标对应中...") for ret in tqdm.tqdm(ret_list,desc="生成目标对应"): - pro_dict[ret[0]]["objs"].append(ret[1]) + if ret[0] in pro_dict: + pro_dict[ret[0]]["objs"].append(ret[1]) - sql = "SELECT * FROM tagcorresp;" #生成tags + sql = "SELECT * FROM tagcorresp WHERE NOT obsolete;" #生成tags mycursor.execute(sql) ret_list = mycursor.fetchall() for id in pro_dict: pro_dict[id]["tags"] = [] # print("生成标签对应中...") for ret in tqdm.tqdm(ret_list,desc = "生成标签对应"): - pro_dict[ret[0]]["tags"].append(ret[1]) + if ret[0] in pro_dict: + pro_dict[ret[0]]["tags"].append(ret[1]) - sql = "SELECT * FROM usages;" #生成usages + sql = "SELECT * FROM usages WHERE NOT obsolete;" #生成usages mycursor.execute(sql) ret_list = mycursor.fetchall() for id in pro_dict: pro_dict[id]["usages"] = [] # print("生成使用记录中...") for ret in tqdm.tqdm(ret_list,desc="生成使用记录"): - u = "\t".join(json.loads(ret[3])) - if ret[1] is None: - pro_dict[ret[0]]["usages"].append(f"{ret[2]}\t{u}") - else: - pro_dict[ret[0]]["usages"].append(f"{ret[1]}\t{ret[2]}\t{u}") + if ret[0] in pro_dict: + u = "\t".join(json.loads(ret[3])) + if ret[1] is None: + pro_dict[ret[0]]["usages"].append(f"{ret[2]}\t{u}") + else: + pro_dict[ret[0]]["usages"].append(f"{ret[1]}\t{ret[2]}\t{u}") sql = "SELECT * FROM edit_history;" #生成edit mycursor.execute(sql) @@ -1681,48 +1691,53 @@ def generateDictsfromMariaDB(mycursor): pro_dict[id]["edit"] = [] # print("生成编辑历史中...") for ret in tqdm.tqdm(ret_list,desc="生成编辑历史"): - pro_dict[ret[0]]["edit"].append(f"{ret[1]}\t{ret[2]}") + if ret[0] in pro_dict: + pro_dict[ret[0]]["edit"].append(f"{ret[1]}\t{ret[2]}") - sql = "SELECT * FROM same;" #生成same + sql = "SELECT * FROM same WHERE NOT obsolete;" #生成same mycursor.execute(sql) ret_list = mycursor.fetchall() for id in pro_dict: pro_dict[id]["same"] = [] # print("生成same联系中...") for ret in tqdm.tqdm(ret_list,desc="关联相同题目"): - pro_dict[ret[0]]["same"].append(ret[1]) - pro_dict[ret[1]]["same"].append(ret[0]) + if ret[0] in pro_dict and ret[1] in pro_dict: + pro_dict[ret[0]]["same"].append(ret[1]) + pro_dict[ret[1]]["same"].append(ret[0]) - sql = "SELECT * FROM related;" #生成related + sql = "SELECT * FROM related WHERE NOT obsolete;" #生成related mycursor.execute(sql) ret_list = mycursor.fetchall() for id in pro_dict: pro_dict[id]["related"] = [] # print("生成related联系中...") for ret in tqdm.tqdm(ret_list,desc="关联相关题目"): - pro_dict[ret[0]]["related"].append(ret[1]) - pro_dict[ret[1]]["related"].append(ret[0]) + if ret[0] in pro_dict and ret[1] in pro_dict: + pro_dict[ret[0]]["related"].append(ret[1]) + pro_dict[ret[1]]["related"].append(ret[0]) - sql = "SELECT * FROM unrelated;" #生成unrelated + sql = "SELECT * FROM unrelated WHERE NOT obsolete;" #生成unrelated mycursor.execute(sql) ret_list = mycursor.fetchall() for id in pro_dict: pro_dict[id]["unrelated"] = [] # print("生成unrelated联系中...") for ret in tqdm.tqdm(ret_list,desc="关联无关题目"): - pro_dict[ret[0]]["unrelated"].append(ret[1]) - pro_dict[ret[1]]["unrelated"].append(ret[0]) + if ret[0] in pro_dict and ret[1] in pro_dict: + pro_dict[ret[0]]["unrelated"].append(ret[1]) + pro_dict[ret[1]]["unrelated"].append(ret[0]) - sql = "SELECT * FROM remarks;" #生成remark + sql = "SELECT * FROM remarks WHERE NOT obsolete;" #生成remark mycursor.execute(sql) ret_list = mycursor.fetchall() for id in pro_dict: pro_dict[id]["remark"] = [] # print("生成备注中...") for ret in tqdm.tqdm(ret_list,desc="生成备注"): - pro_dict[ret[0]]["remark"].append(f"{ret[1]}\t{ret[2]}") + if ret[0] in pro_dict: + pro_dict[ret[0]]["remark"].append(f"{ret[1]}\t{ret[2]}") - sql = "SELECT * FROM lessonobj;" #生成obj_dict + sql = "SELECT * FROM lessonobj WHERE NOT obsolete;" #生成obj_dict mycursor.execute(sql) ret_list = mycursor.fetchall() # print("生成课时目标dict中...") @@ -1738,7 +1753,7 @@ def generateDictsfromMariaDB(mycursor): for ret in tqdm.tqdm(ret_list,desc = "构建课时目标顺序"): obj_dict[ret[0]]["predecessor"].append(ret[1]) - sql = "SELECT * FROM unitobj;" #生成unit_obj_dict + sql = "SELECT * FROM unitobj WHERE NOT obsolete;" #生成unit_obj_dict mycursor.execute(sql) ret_list = mycursor.fetchall() # print("生成单元目标dict中...") @@ -1746,21 +1761,22 @@ def generateDictsfromMariaDB(mycursor): unit_obj_dict[ret[0]] = {"unitobjid":ret[0],"unitobjcontent":ret[1]} - sql = "SELECT * FROM basic_knowledges;" #生成bn_dict + sql = "SELECT * FROM basic_knowledges WHERE NOT obsolete;" #生成bn_dict mycursor.execute(sql) ret_list = mycursor.fetchall() # print("生成基础知识dict中...") for ret in tqdm.tqdm(ret_list,desc = "生成基础知识"): bn_dict[ret[0]] = {"bnid":ret[0],"bncontent":ret[1]} - sql = "SELECT * FROM bn_obj_corresp;" #生成bn与obj的对应 + sql = "SELECT * FROM bn_obj_corresp WHERE NOT obsolete;" #生成bn与obj的对应 mycursor.execute(sql) ret_list = mycursor.fetchall() for bnid in bn_dict: bn_dict[bnid]["objs"] = [] # print("生成基础知识与课时目标对应中...") for ret in tqdm.tqdm(ret_list,desc = "对应基础知识与课时目标"): - bn_dict[ret[0]]["objs"].append(ret[1]) + if ret[0] in bn_dict: + bn_dict[ret[0]]["objs"].append(ret[1]) return pro_dict,obj_dict,bn_dict,unit_obj_dict def generateLaTeXBodyContentFromDict(id,adict,objdict,misc): #根据id,读取的json内容adict,和字典misc来生成讲义 @@ -1843,7 +1859,7 @@ def generateLaTeXBodyContentfromMariaDB(cursor,id,misc): #根据id,读取的json # } # } id = str(id).zfill(6) - sql = "SELECT content,ans,solution,origin,space FROM problems WHERE ID = %s;" + sql = "SELECT content,ans,solution,origin,space FROM problems WHERE ID = %s AND NOT obsolete;" val = (id,) cursor.execute(sql,val) ret_list = cursor.fetchall() @@ -1855,27 +1871,29 @@ def generateLaTeXBodyContentfromMariaDB(cursor,id,misc): #根据id,读取的json solution = "" origin = json.loads(raw_origin) #以下生成obj_list - sql = "SELECT obj_ID FROM objcorresp WHERE ID = %s;" + sql = "SELECT obj_ID FROM objcorresp WHERE ID = %s AND NOT obsolete;" cursor.execute(sql,val) ret_list = cursor.fetchall() obj_list = [] for id_raw in ret_list: obj_id = id_raw[0] - sql = "SELECT obj_content FROM lessonobj WHERE objid = %s;" + sql = "SELECT obj_content FROM lessonobj WHERE objid = %s AND NOT obsolete;" if not obj_id.upper() == "KNONE": objval = (obj_id,) cursor.execute(sql,objval) - obj_list.append(f"{obj_id}\t{cursor.fetchall()[0][0]}") + retobj = cursor.fetchall() + if len(retobj) >= 1: + obj_list.append(f"{obj_id}\t{retobj[0][0]}") else: cursor.fetchall() obj_list.append(f"{obj_id}\t暂无目标对应") - sql = "SELECT tagname FROM tagcorresp WHERE ID = %s;" + sql = "SELECT tagname FROM tagcorresp WHERE ID = %s AND NOT obsolete;" cursor.execute(sql,val) tag_list = [t[0] for t in cursor.fetchall()] - sql = "SELECT date,remark_content FROM remarks WHERE ID = %s;" + sql = "SELECT date,remark_content FROM remarks WHERE ID = %s AND NOT obsolete;" cursor.execute(sql,val) remark_list = sorted([f"{t[0]}\t{t[1]}" for t in cursor.fetchall()]) - sql = "SELECT date,classname,diff FROM usages WHERE ID = %s;" + sql = "SELECT date,classname,diff FROM usages WHERE ID = %s AND NOT obsolete;" cursor.execute(sql,val) usages_fetched = [(u[0] if not u[0] is None else "",u[1],json.loads(u[2])) for u in cursor.fetchall()] usages_raw = sorted(usages_fetched) @@ -1943,7 +1961,7 @@ def generateLaTeXobjsfromMariaDB(cursor,objid): if objid == "KNONE": return "" else: - sql = "SELECT obj_content FROM lessonobj WHERE objid = %s;" + sql = "SELECT obj_content FROM lessonobj WHERE objid = %s AND not obsolete;" val = (objid,) cursor.execute(sql,val) obj_content = cursor.fetchall()[0][0] @@ -1952,7 +1970,7 @@ def generateLaTeXobjsfromMariaDB(cursor,objid): def generateLaTeXbnsfromMariaDB(cursor,bnid): bnid = str(bnid).upper().strip() - sql = "SELECT bn_content FROM basic_knowledges WHERE bn_id = %s;" + sql = "SELECT bn_content FROM basic_knowledges WHERE bn_id = %s AND not obsolete;" val = (bnid,) cursor.execute(sql,val) try: @@ -2830,7 +2848,7 @@ def unUnitted(idexp,database): #返回adict中未赋单元的id列表 idlist = generate_number_set(idexp) mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - mycursor.execute("SELECT ID FROM tagcorresp WHERE tagname REGEXP '第\\\\S*单元' or tagname = '暂无对应';") + mycursor.execute("SELECT ID FROM tagcorresp WHERE tagname REGEXP '第\\\\S*单元' or tagname = '暂无对应' AND not obsolete;") unittedids = set([ret[0] for ret in mycursor.fetchall()]) ununittedids = sorted(list(set(idlist)-unittedids)) return ununittedids @@ -3118,7 +3136,7 @@ def ChooseIDsByUsageInterval(startdate,enddate,interval,classregex,database): # usedproblems = [] mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mycursor = mydb.cursor() - sql = "SELECT ID,date,classname,diff FROM usages;" + sql = "SELECT ID,date,classname,diff FROM usages where NOT obsolete;" mycursor.execute(sql) usage_list = mycursor.fetchall() for id,date,classname,diff_raw in usage_list: @@ -3155,7 +3173,7 @@ def getAllIDsExp(database,obsincluded = True): #获取题库中所有题目的id if obsincluded: mycursor.execute("SELECT ID FROM problems;") else: - mycursor.execute("SELECT ID FROM problems WHERE NOT content REGEXP 'OBS';") + mycursor.execute("SELECT ID FROM problems WHERE NOT obsolete;") idlist = [ret[0] for ret in mycursor.fetchall()] return generate_exp(idlist) @@ -3173,7 +3191,7 @@ def parseRemark(string): #从一行remark字符串中分出日期和内容, 返 def generateProDict(cursor): #从数据库的cursor中得到problems字典的content,ans,solution,genre字段 - cursor.execute("select ID,content,ans,solution,genre,origin from problems;") + cursor.execute("select ID,content,ans,solution,genre,origin from problems WHERE NOT obsolete;") ret_list = cursor.fetchall() prodict = {ret[0]:{"content":ret[1],"ans":ret[2],"solution":ret[3],"genre":ret[4],"origin":json.loads(ret[5])} for ret in ret_list} return prodict diff --git a/工具v4/修改目标内容.py b/工具v4/修改目标内容.py index acea48ce..7af8a070 100644 --- a/工具v4/修改目标内容.py +++ b/工具v4/修改目标内容.py @@ -33,7 +33,7 @@ class MyWindow_xgmb(QWidget,Ui_Form): else: self.obj_type = "error" if self.obj_type == "lesson": - sql = "SELECT * FROM lessonobj WHERE objid = %s;" + sql = "SELECT * FROM lessonobj WHERE objid = %s AND NOT obsolete;" val = (self.id,) self.cursor.execute(sql,val) ret_list = self.cursor.fetchall() @@ -44,7 +44,7 @@ class MyWindow_xgmb(QWidget,Ui_Form): self.objcontent_raw = ret_list[0][1] self.plainTextEdit_objcontent.setPlainText(self.objcontent_raw) elif self.obj_type == "unit": - sql = "SELECT * FROM unitobj WHERE unit_obj_id = %s;" + sql = "SELECT * FROM unitobj WHERE unit_obj_id = %s AND NOT obsolete;" val = (self.id,) self.cursor.execute(sql,val) ret_list = self.cursor.fetchall() diff --git a/工具v4/关键字筛选题号.py b/工具v4/关键字筛选题号.py index 4957beef..eb38ff08 100644 --- a/工具v4/关键字筛选题号.py +++ b/工具v4/关键字筛选题号.py @@ -50,7 +50,7 @@ class MyWindow_sxth(QWidget,Ui_Form): def exec(self): mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = self.database_name) mycursor = mydb.cursor() - mycursor.execute("SELECT count(*) FROM problems WHERE NOT content REGEXP 'OBS';") + mycursor.execute("SELECT count(*) FROM problems WHERE NOT obsolete;") self.lcdNumber_resCount.display(mycursor.fetchall()[0][0]) self.matchlist = MatchConditioninMariaDB(self.conditions,self.database_name) self.lcdNumber_resCount.display(len(self.matchlist)) diff --git a/工具v4/删除使用记录.py b/工具v4/删除使用记录.py index 1bdc5b00..be1c1307 100644 --- a/工具v4/删除使用记录.py +++ b/工具v4/删除使用记录.py @@ -31,7 +31,7 @@ class MyWindow_scjl(QWidget,Ui_Form): self.id = self.lineEdit_id.text().strip().zfill(6) self.dateregex = self.lineEdit_dateregex.text().strip() self.classregex = self.lineEdit_classregex.text().strip() - self.mycursor.execute("SELECT * FROM usages WHERE ID = %s;",(self.id,)) + self.mycursor.execute("SELECT * FROM usages WHERE ID = %s AND not obsolete;",(self.id,)) ret_list = self.mycursor.fetchall() self.usage_list = [] for ret in ret_list: @@ -47,15 +47,15 @@ class MyWindow_scjl(QWidget,Ui_Form): self.pushButton_del.setEnabled(False) def delete(self): self.mycursor = self.db.cursor() - self.mycursor.execute("SELECT count(*) FROM usages;") + self.mycursor.execute("SELECT count(*) FROM usages WHERE not obsolete;") print(f"预删除前有 {self.mycursor.fetchall()[0][0]} 条使用记录.") - sql1 = "DELETE FROM usages WHERE ID = %s AND date = %s AND classname = %s AND diff = %s;" + sql1 = "UPDATE usages SET obsolete = TRUE WHERE ID = %s AND date = %s AND classname = %s AND diff = %s;" sql2 = "INSERT INTO logs (DATE,TIME,username,action,id,db_content) VALUE (%s,%s,%s,%s,%s,%s);" for u in tqdm.tqdm(self.usage_list,desc = "删除使用记录"): - self.mycursor.execute(sql1,u) + self.mycursor.execute(sql1,u[:4]) val = (GetDate(),GetTime(),get_git_username(),"删除使用记录",self.id,f"{u}") self.mycursor.execute(sql2,val) - self.mycursor.execute("SELECT count(*) FROM usages;") + self.mycursor.execute("SELECT count(*) FROM usages WHERE not obsolete;") print(f"删除后将有 {self.mycursor.fetchall()[0][0]} 条使用记录.") self.pushButton_commit.setEnabled(True) def commit(self): diff --git a/工具v4/删除课时目标关系.py b/工具v4/删除课时目标关系.py index 16a1d2f8..9cf4e8cb 100644 --- a/工具v4/删除课时目标关系.py +++ b/工具v4/删除课时目标关系.py @@ -34,7 +34,7 @@ class MyWindow_scgx(QWidget,Ui_Form): self.lineEdit_todelete.textChanged.connect(self.enable_del) self.db = connect(hostname=db_host, port=db_port, username= db_user, pwd= db_pwd, db=self.database_name) self.mycursor = self.db.cursor() - self.mycursor.execute("SELECT objid,obj_content FROM lessonobj;") + self.mycursor.execute("SELECT objid,obj_content FROM lessonobj WHERE not obsolete;") ret_list = self.mycursor.fetchall() self.allobjs = "" for ret in ret_list: @@ -42,7 +42,7 @@ class MyWindow_scgx(QWidget,Ui_Form): self.plainTextEdit_objs.setPlainText(self.allobjs) def getobj(self): objid = self.lineEdit_objid.text().strip() - self.mycursor.execute("SELECT objid,obj_content FROM lessonobj WHERE objid = %s;",(objid,)) + self.mycursor.execute("SELECT objid,obj_content FROM lessonobj WHERE objid = %s AND not obsolete;",(objid,)) ret_list = self.mycursor.fetchall() if len(ret_list) == 0 or len(ret_list) >= 2: self.plainTextEdit_objs.setPlainText("目标编号有误, 请重试!!!\n\n"+self.allobjs) @@ -55,12 +55,12 @@ class MyWindow_scgx(QWidget,Ui_Form): self.tableWidget_prec.setRowCount(0) self.tableWidget_post.clearContents() self.tableWidget_post.setRowCount(0) - self.mycursor.execute("SELECT inherit_from FROM objinherit WHERE objid = %s;",(self.objid,)) + self.mycursor.execute("SELECT inherit_from FROM objinherit WHERE objid = %s AND not obsolete;",(self.objid,)) ret_list = self.mycursor.fetchall() for ret in ret_list: # print(ret) count += 1 - self.mycursor.execute("SELECT obj_content FROM lessonobj WHERE objid = %s;",(ret[0],)) + self.mycursor.execute("SELECT obj_content FROM lessonobj WHERE objid = %s AND not obsolete;",(ret[0],)) prec_content = self.mycursor.fetchall()[0][0] self.tableWidget_prec.insertRow(count-1) self.tableWidget_prec.setItem(count-1,0,QTableWidgetItem(str(count))) @@ -68,13 +68,13 @@ class MyWindow_scgx(QWidget,Ui_Form): self.tableWidget_prec.setItem(count-1,2,QTableWidgetItem(prec_content)) self.corresp_list.append((count,self.objid,ret[0])) prec_count = count - self.mycursor.execute("SELECT objid FROM objinherit WHERE inherit_from = %s;",(self.objid,)) + self.mycursor.execute("SELECT objid FROM objinherit WHERE inherit_from = %s AND not obsolete;",(self.objid,)) ret_list = self.mycursor.fetchall() count = 0 for ret in ret_list: # print(ret) count += 1 - self.mycursor.execute("SELECT obj_content FROM lessonobj WHERE objid = %s;",(ret[0],)) + self.mycursor.execute("SELECT obj_content FROM lessonobj WHERE objid = %s AND not obsolete;",(ret[0],)) post_content = self.mycursor.fetchall()[0][0] self.tableWidget_post.insertRow(count-1) self.tableWidget_post.setItem(count-1,0,QTableWidgetItem(str(count+prec_count))) @@ -95,7 +95,7 @@ class MyWindow_scgx(QWidget,Ui_Form): inherit_from = item[2] break self.mycursor = self.db.cursor() - self.mycursor.execute("DELETE FROM objinherit WHERE objid = %s AND inherit_from = %s;",(objid,inherit_from)) + self.mycursor.execute("UPDATE objinherit SET obsolete = TRUE WHERE objid = %s AND inherit_from = %s;",(objid,inherit_from)) sql = "INSERT INTO logs (DATE,TIME,username,action,db_content) VALUE (%s,%s,%s,%s,%s);" val = (GetDate(),GetTime(),get_git_username(),f"删除目标关联",f"{objid} <- {inherit_from}") self.mycursor.execute(sql,val) diff --git a/工具v4/单一题号转为图片.py b/工具v4/单一题号转为图片.py index 5b0923ac..d25a32d6 100644 --- a/工具v4/单一题号转为图片.py +++ b/工具v4/单一题号转为图片.py @@ -26,7 +26,7 @@ class MyWindow_sctp(QWidget,Ui_Form): self.dpi = self.lineEdit_dpi.text() mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = self.database_name) mycursor = mydb.cursor() - sql = "SELECT content FROM problems WHERE ID = %s;" + sql = "SELECT content FROM problems WHERE ID = %s AND NOT obsolete;" val = (self.id.strip().zfill(6),) mycursor.execute(sql,val) content = mycursor.fetchall()[0][0] diff --git a/工具v4/基础知识编辑.py b/工具v4/基础知识编辑.py index 38639f45..29e3848f 100644 --- a/工具v4/基础知识编辑.py +++ b/工具v4/基础知识编辑.py @@ -30,7 +30,7 @@ class MyWindow_bjjc(QWidget,Ui_Form): self.id = self.lineEdit_bnid.text().upper() if not self.id[0] == "B": self.id = "B" + str(int(self.id)).zfill(5) - sql = "SELECT * FROM basic_knowledges WHERE bn_id = %s;" + sql = "SELECT * FROM basic_knowledges WHERE bn_id = %s AND not obsolete;" val = (self.id,) self.cursor.execute(sql,val) ret_list = self.cursor.fetchall() @@ -39,7 +39,7 @@ class MyWindow_bjjc(QWidget,Ui_Form): else: self.bn_content_raw = ret_list[0][1] self.plainTextEdit_content.setPlainText(self.bn_content_raw) - sql = "SELECT * from bn_obj_corresp WHERE bn_id = %s;" + sql = "SELECT * from bn_obj_corresp WHERE bn_id = %s AND not obsolete;" val = (self.id,) self.cursor.execute(sql,val) ret_list = self.cursor.fetchall() @@ -48,10 +48,14 @@ class MyWindow_bjjc(QWidget,Ui_Form): for ret in ret_list: count += 1 objid = ret[1] - sql = "SELECT * FROM lessonobj WHERE objid = %s;" + sql = "SELECT * FROM lessonobj WHERE objid = %s AND not obsolete;" val = (objid,) self.cursor.execute(sql,val) - obj_content = self.cursor.fetchall()[0][1] + retcontent = self.cursor.fetchall() + if len(retcontent) >= 1: + obj_content = retcontent[0][1] + else: + obj_content = "已作废" self.tableWidget_obj.setItem(count-1,0,QTableWidgetItem(objid)) self.tableWidget_obj.setItem(count-1,1,QTableWidgetItem(obj_content)) diff --git a/工具v4/备注信息收集.py b/工具v4/备注信息收集.py index 21236b27..3b212ef5 100644 --- a/工具v4/备注信息收集.py +++ b/工具v4/备注信息收集.py @@ -20,11 +20,11 @@ def show_image(): id = request.form['question_number'].zfill(6) mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = "tiku") mycursor = mydb.cursor() - sql = "SELECT content FROM problems WHERE ID = %s;" + sql = "SELECT content FROM problems WHERE ID = %s AND not obsolete;" val = (id,) mycursor.execute(sql,val) content = mycursor.fetchall()[0][0] - sql = "SELECT date,remark_content FROM remarks WHERE ID = %s;" + sql = "SELECT date,remark_content FROM remarks WHERE ID = %s AND not obsolete;" mycursor.execute(sql,val) remark_list = sorted(mycursor.fetchall(),key=lambda item:item[0],reverse=True) # print(remark_list) @@ -71,7 +71,7 @@ def submit_remarks(): # mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = "tikutest") mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = "tiku") mycursor = mydb.cursor() - sql = f"SELECT * FROM remarks WHERE ID = %s and remark_content = %s;" + sql = f"SELECT * FROM remarks WHERE ID = %s and remark_content = %s AND not obsolete;" val = (id,f"({category}){remarks}") print(f"({category}){remarks}") mycursor.execute(sql,val) diff --git a/工具v4/批量收录新题.py b/工具v4/批量收录新题.py index 883a9fa5..47f66ac4 100644 --- a/工具v4/批量收录新题.py +++ b/工具v4/批量收录新题.py @@ -37,7 +37,7 @@ class MyWindow_bdsl(QWidget,Ui_Form): mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = self.database_name) mycursor = mydb.cursor() - mycursor.execute("SELECT ID,content FROM problems;") + mycursor.execute("SELECT ID,content FROM problems WHERE NOT obsolete;") ret_list = mycursor.fetchall() pro_dict = {i:j for i,j in ret_list} treated_dict = {i:pre_treating(pro_dict[i]) for i in pro_dict.keys()} diff --git a/工具v4/新增基础知识梳理.py b/工具v4/新增基础知识梳理.py index 40e36105..4d04a2ea 100644 --- a/工具v4/新增基础知识梳理.py +++ b/工具v4/新增基础知识梳理.py @@ -52,7 +52,7 @@ class MyWindow_tjjc(QWidget,Ui_Form): mycursor.execute(sql,val) print(f"已导入基础知识 编号: {bnid},\n 内容: {content}.") for objid in obj_list: - sql = "SELECT * FROM lessonobj WHERE objid = %s;" + sql = "SELECT * FROM lessonobj WHERE objid = %s AND NOT obsolete;" val = (objid,) mycursor.execute(sql,val) ret =mycursor.fetchall() diff --git a/工具v4/新增目标关系.py b/工具v4/新增目标关系.py index 7d5d4458..b1f91589 100644 --- a/工具v4/新增目标关系.py +++ b/工具v4/新增目标关系.py @@ -28,7 +28,7 @@ class MyWindow_xzgx(QWidget,Ui_Form): self.plainTextEdit_data.textChanged.connect(self.disable_import) self.db = connect(hostname=db_host, port=db_port, username= db_user, pwd= db_pwd, db=self.database_name) self.mycursor = self.db.cursor() - self.mycursor.execute("SELECT objid from lessonobj;") + self.mycursor.execute("SELECT objid from lessonobj WHERE NOT obsolete;") self.objids = [item[0] for item in self.mycursor.fetchall()] # print(self.objids) @@ -70,7 +70,7 @@ class MyWindow_xzgx(QWidget,Ui_Form): for line in tqdm.tqdm(self.valid_lines): mainid = line[0] for precid in line[1]: - self.mycursor.execute("SELECT * FROM objinherit WHERE objid = %s AND inherit_from = %s;",(mainid,precid)) + self.mycursor.execute("SELECT * FROM objinherit WHERE objid = %s AND inherit_from = %s AND not obsolete;",(mainid,precid)) ret_list = self.mycursor.fetchall() if len(ret_list) >= 1: output += f"*** {mainid} 以 {precid} 为前序的记录已在数据库 {self.database_name} 中\n" diff --git a/工具v4/网页获取讲义.py b/工具v4/网页获取讲义.py index be3a2746..01c1ef66 100644 --- a/工具v4/网页获取讲义.py +++ b/工具v4/网页获取讲义.py @@ -119,7 +119,7 @@ def index(): # raw_pro_dict = load_dict("../题库0.3/Problems.json") # obj_dict = load_dict("../题库0.3/LessonObj.json") # basicknowledge_dict = load_dict("../题库0.3/BasicKnowledge.json") - mycursor.execute("SELECT ID FROM problems;") + mycursor.execute("SELECT ID FROM problems WHERE NOT obsolete;") id_list_in_DB = [ret[0] for ret in mycursor.fetchall()] id_dict = {a:[] for a in id_list_in_DB} problems_list = generate_number_set(pid,id_dict) diff --git a/工具v4/试卷列表.py b/工具v4/试卷列表.py index 10a46be9..fb593332 100644 --- a/工具v4/试卷列表.py +++ b/工具v4/试卷列表.py @@ -29,7 +29,7 @@ class MyWindow_sjlb(QWidget,Ui_Form): buttontext = self.sender().text() # print(buttontext) self.mycursor = self.db.cursor() - self.mycursor.execute("SELECT name,idexp,remark FROM papers WHERE genre = %s;",(buttontext,)) + self.mycursor.execute("SELECT name,idexp,remark FROM papers WHERE genre = %s AND NOT obsolete;",(buttontext,)) ret_list = self.mycursor.fetchall() self.tableWidget_papers.setRowCount(len(ret_list)) count = 0 diff --git a/工具v4/题目内容直接编辑.py b/工具v4/题目内容直接编辑.py index de6ca843..0f20022e 100644 --- a/工具v4/题目内容直接编辑.py +++ b/工具v4/题目内容直接编辑.py @@ -38,7 +38,7 @@ class MyWindow_bjtm(QWidget,Ui_Form): def showcontent(self): self.field = "题目内容" self.label_2.setText(f"题号 {self.lineEdit_ID.text()} 的 {self.field} 字段") - sql = "SELECT content FROM problems WHERE ID = (%s);" + sql = "SELECT content FROM problems WHERE ID = (%s) AND NOT obsolete;" val = (self.lineEdit_ID.text().zfill(6),) self.cursor.execute(sql,val) ret = self.cursor.fetchall() @@ -50,7 +50,7 @@ class MyWindow_bjtm(QWidget,Ui_Form): def showgenre(self): self.field = "类型" self.label_2.setText(f"题号 {self.lineEdit_ID.text()} 的 {self.field} 字段") - sql = "SELECT genre FROM problems WHERE ID = (%s);" + sql = "SELECT genre FROM problems WHERE ID = (%s) AND NOT obsolete;" val = (self.lineEdit_ID.text().zfill(6),) self.cursor.execute(sql,val) ret = self.cursor.fetchall() @@ -62,7 +62,7 @@ class MyWindow_bjtm(QWidget,Ui_Form): def showans(self): self.field = "答案" self.label_2.setText(f"题号 {self.lineEdit_ID.text()} 的 {self.field} 字段") - sql = "SELECT ans FROM problems WHERE ID = (%s);" + sql = "SELECT ans FROM problems WHERE ID = (%s) AND NOT obsolete;" val = (self.lineEdit_ID.text().zfill(6),) self.cursor.execute(sql,val) ret = self.cursor.fetchall() @@ -74,7 +74,7 @@ class MyWindow_bjtm(QWidget,Ui_Form): def showsolution(self): self.field = "解答" self.label_2.setText(f"题号 {self.lineEdit_ID.text()} 的 {self.field} 字段") - sql = "SELECT solution FROM problems WHERE ID = (%s);" + sql = "SELECT solution FROM problems WHERE ID = (%s) AND NOT obsolete;" val = (self.lineEdit_ID.text().zfill(6),) self.cursor.execute(sql,val) ret = self.cursor.fetchall() @@ -86,7 +86,7 @@ class MyWindow_bjtm(QWidget,Ui_Form): def showorigin(self): self.field = "来源" self.label_2.setText(f"题号 {self.lineEdit_ID.text()} 的 {self.field} 字段") - sql = "SELECT origin FROM problems WHERE ID = (%s);" + sql = "SELECT origin FROM problems WHERE ID = (%s) AND NOT obsolete;" val = (self.lineEdit_ID.text().zfill(6),) self.cursor.execute(sql,val) ret = self.cursor.fetchall() @@ -98,7 +98,7 @@ class MyWindow_bjtm(QWidget,Ui_Form): def showremarks(self): self.field = "备注" self.label_2.setText(f"题号 {self.lineEdit_ID.text()} 的 {self.field} 字段") - sql = "SELECT date,remark_content FROM remarks WHERE ID = (%s);" + sql = "SELECT date,remark_content FROM remarks WHERE ID = (%s) AND NOT obsolete;" val = (self.lineEdit_ID.text().zfill(6),) self.cursor.execute(sql,val) ret_list = self.cursor.fetchall()