296 lines
12 KiB
Python
296 lines
12 KiB
Python
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("暂无记录!")
|