import re import pymysql # pylint: disable=e0401 # type: ignore # 拆分sql对象 def extract_tables(sql_statement): # 使用正则表达式匹配FROM关键字之后的表名以及逗号分隔的表名: pattern = r"FROM\s+([\w\s,]+)" matches = re.findall(pattern, sql_statement, re.IGNORECASE) # 提取逗号分隔的表名,并按逗号进行分割 tabs = re.split(",", matches[0].strip()) # 处理每个表名,去除空格和其他无关字符 cleaned_tables = [] for tab in tabs: cleaned_tab = tab.strip() if " " in cleaned_tab: cleaned_tab = cleaned_tab.split()[0] cleaned_tables.append(cleaned_tab) return cleaned_tables # 返回列表 # 拆分sql def divide_sql(sql): """ 例如sql = "SELECT a FROM data1, data2, data3 WHERE a = b ORDER BY misc" 拆分原语句 """ parts = re.split(r"(?i)from\s", sql) # 拆分"from "【无论大小写】 head = parts[0] + "from " # SELECT a FROM divide_sqls = [] if re.search(r"where", parts[1], flags=re.IGNORECASE): data = re.split(r"(?i) where", parts[1]) # 拆分" where"【无论大小写】 tail = " where" + data[1] # WHERE a = b ORDER BY misc # message_p = "涉及到的数据源有:" # print(message_p) # time.sleep(sleep_time) # # message_p = data[0] # print(message_p) # data1, data2, data3 # time.sleep(sleep_time) divide_providers = data[0].split(", ") # total = len(divide_providers) # message_p = "拆分结果如下:" # print(message_p) for i in range(len(divide_providers)): divide_sqls.append(head + divide_providers[i] + tail) # message_p = str(i + 1) + ":" + divide_sqls[i] # print(message_p) else: data = parts[1] # data1,data2,data3 divide_providers = data.split(",") for i in range(len(divide_providers)): divide_sqls.append(head + divide_providers[i]) # message_p = str(i + 1) + ":" + divide_sqls[i] # print(message_p) return divide_sqls class SelectDatabase: # 定义类 def __init__(self, database): self.database = database # 赋值数据库名称 def ret_hospital(self): # 定义函数,返回字典——医院(HOS)这个表 # 连接服务器Server的数据库: db = pymysql.connect( host="localhost", user="root", password="111111", db=f"{self.database}", charset="utf8", ) # 使用操作游标: cursor = db.cursor() sql = """SELECT * FROM HOS""" cursor.execute(sql) results = cursor.fetchall() # 获取查询结果的所有数据 hospital_dict = {} # 创建一个空字典 # 遍历查询结果,将每条消息数据存储到字典中: for row in results: hos_id = row[0] # 医院编号(HOS_ID) hos_name = row[1] # 医院名称(HOS_NAME) hos_add = row[2] # 医院地址(HOS_ADD) hos_tel = row[3] # 医院电话(HOS_TEL) # hospital_dict["医院编号"] = hos_id # hospital_dict["医院名称"] = hos_name # hospital_dict["医院地址"] = hos_add # hospital_dict["医院电话"] = hos_tel # # 打印字典内容 # print(hospital_dict) """ 注释的输出形式: {'医院编号': '001', '医院名称': '极光医院', '医院地址': '千里市广大区极光街道1-1', '医院电话': '023-6296666'} {'医院编号': '002', '医院名称': '风舱医院', '医院地址': '风火市舱山区飞光街道1-1', '医院电话': '023-6286666'} """ # 将每个属性的值存储在对应的列表中 hospital_dict.setdefault("医院编号", []).append(hos_id) hospital_dict.setdefault("医院名称", []).append(hos_name) hospital_dict.setdefault("医院地址", []).append(hos_add) hospital_dict.setdefault("医院电话", []).append(hos_tel) db.close() """ 当前返回的字典形式: {'医院编号': ['001', '002'], '医院名称': ['极光医院', '风舱医院'], '医院地址': ['千里市广大区极光街道1-1', '风火市舱山区飞光街道1-1'], '医院电话': ['023-6296666', '023-6286666']} """ # 返回字典 return hospital_dict def ret_doctor(self): # 定义函数,返回字典——医生(DOC)这个表 # 连接服务器Server的数据库: db = pymysql.connect( host="localhost", user="root", password="111111", db=f"{self.database}", charset="utf8", ) # 使用操作游标: cursor = db.cursor() sql = """SELECT * FROM DOC""" cursor.execute(sql) results = cursor.fetchall() # 获取查询结果的所有数据 doctor_dict = {} # 创建一个空字典 # 遍历查询结果,将每条消息数据存储到字典中: for row in results: doc_id = row[0] # 医生编号(DOC_ID) doc_name = row[1] # 医生名称(DOC_NAME) doc_tel = row[2] # 医生电话(DOC_TEL) doc_qua = row[3] # 医院资质(DOC_QUA) # hospital_dict["医生编号"] = doc_id # hospital_dict["医生名称"] = doc_name # hospital_dict["医院地址"] = doc_tel # hospital_dict["医院电话"] = doc_qua # # 打印字典内容 # print(doctor_dict) # 将每个属性的值存储在对应的列表中 doctor_dict.setdefault("医院编号", []).append(doc_id) doctor_dict.setdefault("医院名称", []).append(doc_name) doctor_dict.setdefault("医院地址", []).append(doc_tel) doctor_dict.setdefault("医院电话", []).append(doc_qua) db.close() """ 当前返回的字典形式: {'医院编号': ['001', '002', '003'], '医院名称': ['神医华佗', '扁鹊', '还医生'], '医院地址': ['19666666666', '13666666666', '13546981623'], '医院电话': ['主任医师', '主任医师', '医师']} """ # 返回字典 return doctor_dict def ret_patient(self): # 定义函数,返回字典——病人(PAT)这个表 # 连接服务器Server的数据库: db = pymysql.connect( host="localhost", user="root", password="111111", db=f"{self.database}", charset="utf8", ) # 使用操作游标: cursor = db.cursor() sql = """SELECT * FROM PAT""" cursor.execute(sql) results = cursor.fetchall() # 获取查询结果的所有数据 patient_dict = {} # 创建一个空字典 # 遍历查询结果,将每条消息数据存储到字典中: for row in results: pat_id = row[0] # 病人编号(PAT_ID) pat_name = row[1] # 病人姓名(PAT_NAME) pat_tel = row[2] # 病人电话(PAT_TEL) # patient_dict["病人编号"] = pat_id # patient_dict["病人姓名"] = pat_name # patient_dict["病人电话"] = pat_tel # # 打印字典内容 # print(patient_dict) # 将每个属性的值存储在对应的列表中 patient_dict.setdefault("病人编号", []).append(pat_id) patient_dict.setdefault("病人姓名", []).append(pat_name) patient_dict.setdefault("病人电话", []).append(pat_tel) db.close() """ 当前返回的字典形式: {'病人编号': ['001', '002', '003', '004'], '病人姓名': ['曹操', '蔡桓公', '去还', '刘备'], '病人电话': ['66666666666', '02666666666', '01234567891', '98765432101']} """ # 返回字典 return patient_dict def ret_diagnosis(self): # 定义函数,返回字典——诊断(DIA)这个表 # 连接服务器Server的数据库: db = pymysql.connect( host="localhost", user="root", password="111111", db=f"{self.database}", charset="utf8", ) # 使用操作游标: cursor = db.cursor() sql = """SELECT * FROM DIA""" cursor.execute(sql) results = cursor.fetchall() # 获取查询结果的所有数据 diagnosis_dict = {} # 创建一个空字典 # 遍历查询结果,将每条消息数据存储到字典中: for row in results: dia_id = row[0] # 诊号(DIA_ID) doc_id = row[1] # 医生编号(DOC_ID) pat_id = row[2] # 病人编号(PAT_ID) time = row[3] # 时间(TIME) cases = row[4] # 病例(CASES) symptom = row[5] # 症状(SYMPTOM) # diagnosis_dict["诊号"] = dia_id # diagnosis_dict["医生编号"] = doc_id # diagnosis_dict["病人编号"] = pat_id # diagnosis_dict["时间"] = time # diagnosis_dict["病例"] = cases # diagnosis_dict["症状"] = symptom # # 打印字典内容 # print(diagnosis_dict) # 将每个属性的值存储在对应的列表中 diagnosis_dict.setdefault("诊号", []).append(dia_id) diagnosis_dict.setdefault("医生编号", []).append(doc_id) diagnosis_dict.setdefault("病人编号", []).append(pat_id) diagnosis_dict.setdefault("时间", []).append(time) diagnosis_dict.setdefault("病例", []).append(cases) diagnosis_dict.setdefault("症状", []).append(symptom) db.close() """ 当前返回的字典形式: {'诊号': ['001', '002', '003', '004', '005'], '医生编号': ['001', '001', '002', '003', '003'], '病人编号': ['001', '001', '002', '003', '004'], '时间': ['2015.03.04', '2015.05.16', '2016.12.30', '2017.01.15', '2017.01.15'], '病例': ['小感冒', '慢性头痛', '通风', '中风', '脚部内伤'], '症状': ['突然头痛', '头非常痛,不能睡觉', '怕凉', '伤口大量出血,且发烧', '崴脚,走路痛']} """ # 返回字典 return diagnosis_dict def ret_define(self, sql): # 定义函数,返回自定义信息的字典 # 连接服务器Server的数据库: db = pymysql.connect( host="localhost", user="root", password="111111", db=f"{self.database}", charset="utf8", ) try: # 使用操作游标: cursor = db.cursor() cursor.execute(sql) results = cursor.fetchall() # 获取查询结果的所有数据 # tables = extract_tables(sql) # 分离出sql语句中的表名 # 遍历查询结果,将每条消息都输出出来: for row in results: for i in range(len(row)): print(f"{row[i]}\t", end="") print() except: print("查询权限不足!或查询语句出错!") def main(hospital_name): sql = """SELECT * FROM HOS, DOC, PAT, DIA WHERE DOC.DOC_ID = DIA.DOC_ID AND PAT.PAT_ID = DIA.PAT_ID """ hospital_name = hospital_name.replace("\n", "") if hospital_name == "xx大学附属医院": database = SelectDatabase("Hospital1") database.ret_define(sql) elif hospital_name == "xx阳光社区附属医院": database = SelectDatabase("Hospital2") database.ret_define(sql) else: print("暂无记录!")