algo_present/DataSearch.py
2024-04-09 14:34:58 +08:00

296 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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("暂无记录!")