본문 바로가기
파이썬

과제-파이썬 + 데이터베이스를 활용한 과제(병원 인사 관리 시스템_ver2)

by 곽정우 2024. 3. 28.

제가 개발한 프로그램은 병원 내 인사 관리를 용이하게  하기위한 목적으로 설계되었습니다.

환자, 의사, 간호사의 정보를 관리하고 기록하는 기능을 제공합니다.

 

아래 이미지는 환자, 의사, 간호사 엔터티 간의 관계를 나타낸 다이어그램입니다.

파이썬 코드:

import MySQLdb
import time

class Database:
    def __init__(self):
        self.db = None
        self.cursor = None

    def connect(self):
        self.db = MySQLdb.connect('localhost', 'root', '1234', 'hs')
        self.cursor = self.db.cursor()

    def disconnect(self):
        self.cursor.close()
        self.db.close()


class Patient:
    def __init__(self, db):
        self.db = db

    def add_patient(self):
        patient_id = input("환자의 ID를 입력하세요: ")
        name = input("환자의 성과 이름을 입력하세요: ")
        speciality_id = int(input("환자의 전문 분야 ID를 입력하세요: "))
        dob = int(input("환자의 생년월일 6자리를 입력하세요: "))
        doctor_id = int(input("환자의 담당 의사 ID를 입력하세요: "))
        nurse_id = int(input("환자의 담당 간호사 ID를 입력하세요: "))

        self.db.cursor.execute("SELECT D_SpecialityID FROM Doctor WHERE DoctorID = %s", (doctor_id,))
        doctor_speciality = self.db.cursor.fetchone()
        self.db.cursor.execute("SELECT N_SpecialityID FROM Nurse WHERE NurseID = %s", (nurse_id,))
        nurse_speciality = self.db.cursor.fetchone()

        if speciality_id == doctor_speciality[0] and speciality_id == nurse_speciality[0]:
            self.db.cursor.execute(
                "INSERT INTO Patient (PatientID, Name, SpecialityID, dob, DoctorID, NurseID ) VALUES (%s, %s, %s, %s, %s, %s)",
                (patient_id, name, speciality_id, dob, doctor_id, nurse_id))
            self.db.db.commit()
            print("환자 정보가 성공적으로 추가되었습니다.")
        else:
            print("환자와 의사 및 간호사의 전문 분야와 일치하지 않습니다.")


    def view_patient_list(self):
        self.db.cursor.execute("SELECT * FROM Patient")
        patients = self.db.cursor.fetchall()
        print("환자 목록(환자 ID, 이름, 과 코드,생년월일, 의사ID, 간호사ID):")
        for patient in patients:
            print(patient)

    def delete_patient(self):
        patient_id = input("삭제할 환자의 ID를 입력하세요: ")
        self.db.cursor.execute("SELECT * FROM Patient WHERE patientID = %s", (patient_id,))
        result = self.db.cursor.fetchone()
        if result:
            confirm = input(f"삭제할 환자 ID가 {patient_id}이 맞나요? (y/n): ")
            if confirm.lower() == 'y':
                self.db.cursor.execute("DELETE FROM Patient WHERE patientID = %s", (patient_id,))
                self.db.db.commit()
                print("환자 정보가 삭제되었습니다.")
            else:
                print("삭제를 취소하였습니다.")
        else:
            print("해당 ID의 환자가 존재하지 않습니다.")


class Doctor:
    def __init__(self, db):
        self.db = db

    def add_doctor(self):
        doctor_id = int(input("의사 ID를 입력하세요: "))
        name = input("의사의 성과 이름을 입력하세요: ")
        speciality_id = input("전문 분야 ID를 입력하세요: ")
        self.db.cursor.execute("INSERT INTO Doctor (DoctorID, Name, D_SpecialityID) VALUES (%s, %s, %s)",
                               (doctor_id, name, speciality_id))
        self.db.db.commit()
        print("의사 정보가 성공적으로 추가되었습니다.")

    def view_doctor_list(self):
        self.db.cursor.execute("SELECT * FROM Doctor")
        doctors = self.db.cursor.fetchall()
        print("의사 목록(의사ID, 이름, 분야):")
        for doctor in doctors:
            print(doctor)

    def delete_doctor(self):
        doctor_id = input("삭제할 의사의 ID를 입력하세요: ")
        self.db.cursor.execute("SELECT * FROM Doctor WHERE doctorID = %s", (doctor_id,))
        result = self.db.cursor.fetchone()
        if result:
            confirm = input(f"삭제할 의사 ID가 {doctor_id}이 맞나요? (y/n): ")
            if confirm.lower() == 'y':
                self.db.cursor.execute("DELETE FROM Doctor WHERE doctorID = %s", (doctor_id,))
                self.db.db.commit()
                print("의사 정보가 삭제되었습니다.")
            else:
                print("삭제를 취소하였습니다.")
        else:
            print("해당 ID의 의사가 존재하지 않습니다.")

    # 의사가 담당한 환자 정보 조회
    def view_patients_doctor(self):
        doctor_id = input("의사의 ID를 입력하세요: ")
        self.db.cursor.execute("SELECT * FROM Patient WHERE doctorID = %s", (doctor_id,))
        result = self.db.cursor.fetchall()
        if result:
            print(f"의사 ID {doctor_id} 담당 환자 정보:")
            for patient in result:
                print(patient)
        else:
            print(f"의사 ID {doctor_id} 담당 환자가 존재하지 않습니다.")


class Nurse:
    def __init__(self, db):
        self.db = db

    def add_nurse(self):
        nurse_id = int(input("간호사 ID를 입력하세요: "))
        name = input("간호사의 성과 이름을 입력하세요: ")
        speciality_id = input("담당 병동을 입력하세요: ")
        self.db.cursor.execute("INSERT INTO Nurse (nurseID, Name, N_SpecialityID) VALUES (%s, %s, %s)",
                               (nurse_id, name, speciality_id))
        self.db.db.commit()
        print("간호사 정보가 성공적으로 추가되었습니다.")

    def view_nurse_list(self):
        self.db.cursor.execute("SELECT * FROM Nurse")
        nurses = self.db.cursor.fetchall()
        print("간호사 목록(간호사ID, 이름, 분야):")
        for nurse in nurses:
            print(nurse)

    def delete_nurse(self):
        nurse_id = input("삭제할 간호사의 ID를 입력하세요: ")
        self.db.cursor.execute("SELECT * FROM Nurse WHERE nurseId = %s", (nurse_id,))
        result = self.db.cursor.fetchone()
        if result:
            confirm = input(f"삭제할 간호사 ID가 {nurse_id}이 맞나요? (y/n): ")
            if confirm.lower() == 'y':
                self.db.cursor.execute("DELETE FROM Nurse WHERE nurseId = %s", (nurse_id,))
                self.db.db.commit()
                print("간호사 정보가 삭제되었습니다.")
            else:
                print("삭제를 취소하였습니다.")
        else:
            print("해당 ID의 간호사가 존재하지 않습니다.")


class Hsmain:
    def __init__(self):
        self.db = Database()
        self.patient = Patient(self.db)
        self.doctor = Doctor(self.db)
        self.nurse = Nurse(self.db)

    def main(self):
        print('병원 인사 관리 시스템')
        while True:
            menu = "1. 환자\n" \
                   "2. 의사\n" \
                   "3. 간호사\n" \
                   "4. 종료\n" \
                   "원하는 작업을 선택하세요: "

            option = input(menu)
            if option == '1':
                self.patient_menu()
            elif option == '2':
                self.doctor_menu()
            elif option == '3':
                self.nurse_menu()
            elif option == '4':
                print("병원 인사 관리 프로그램 종료.")
                time.sleep(.6)
                print("."),
                time.sleep(.6)
                print(".")
                break
            else:
                print("잘못된 옵션을 선택하셨습니다.")

    def patient_menu(self):
        patient_menu = "1. 환자 정보 추가\n" \
                       "2. 환자 목록 조회\n" \
                       "3. 환자 정보 삭제\n" \
                       "4. 이전 메뉴로 돌아가기\n" \
                       "원하는 작업을 선택하세요: "
        while True:
            patient_option = input(patient_menu)
            if patient_option == '1':
                self.patient.add_patient()
            elif patient_option == '2':
                self.patient.view_patient_list()
            elif patient_option == '3':
                self.patient.delete_patient()
            elif patient_option == '4':
                break
            else:
                print("잘못된 옵션을 선택하셨습니다.")

    def doctor_menu(self):
        doctor_menu = "1. 의사 정보 추가\n" \
                      "2. 의사 목록 조회\n" \
                      "3. 의사 정보 삭제\n" \
                      "4. 의사가 담당한 환자 조회\n" \
                      "5. 이전 메뉴로 돌아가기\n" \
                      "원하는 작업을 선택하세요: "
        while True:
            doctor_option = input(doctor_menu)
            if doctor_option == '1':
                self.doctor.add_doctor()
            elif doctor_option == '2':
                self.doctor.view_doctor_list()
            elif doctor_option == '3':
                self.doctor.delete_doctor()
            elif doctor_option == '4':
                self.doctor.view_patients_doctor()
            elif doctor_option == '5':
                break
            else:
                print("잘못된 옵션을 선택하셨습니다.")

    def nurse_menu(self):
        nurse_menu = "1. 간호사 정보 추가\n" \
                     "2. 간호사 목록 조회\n" \
                     "3. 간호사 정보 삭제\n" \
                     "4. 이전 메뉴로 돌아가기\n" \
                     "원하는 작업을 선택하세요: "
        while True:
            nurse_option = input(nurse_menu)
            if nurse_option == '1':
                self.nurse.add_nurse()
            elif nurse_option == '2':
                self.nurse.view_nurse_list()
            elif nurse_option == '3':
                self.nurse.delete_nurse()
            elif nurse_option == '4':
                break
            else:
                print("잘못된 옵션을 선택하셨습니다.")


if __name__ == "__main__":
    hs = Hsmain()
    hs.db.connect()
    hs.main()
    hs.db.disconnect()

SQL코드:

show databases;

create database hs;

use hs;




CREATE TABLE Speciality (
    SpecialityID INT PRIMARY KEY,
    Name VARCHAR(255)
);

CREATE TABLE Doctor (
    DoctorID INT PRIMARY KEY,
    Name VARCHAR(255),
    D_SpecialityID INT,
    FOREIGN KEY (D_SpecialityID) REFERENCES Speciality(SpecialityID)
);

CREATE TABLE Nurse (
    NurseID INT PRIMARY KEY,
    Name VARCHAR(255),
    N_SpecialityID INT,
    FOREIGN KEY (N_SpecialityID) REFERENCES Speciality(SpecialityID)
);

CREATE TABLE Patient (
    PatientID INT PRIMARY KEY,
    Name VARCHAR(255),
    SpecialityID INT,
    dob INT,
    DoctorID INT,
    NurseID INT,
    FOREIGN KEY (DoctorID) REFERENCES Doctor(DoctorID),
    FOREIGN KEY (NurseID) REFERENCES Nurse(NurseID),
    FOREIGN KEY (SpecialityID) REFERENCES Speciality(SpecialityID)
);



#Speciality 테이블에 데이터
INSERT INTO Speciality (SpecialityID, Name)
VALUES
    (1, 'GS'),
    (2, 'OS'),
    (3, 'PS'),
    (4, 'EM');

#Doctor 테이블에 데이터
INSERT INTO Doctor (DoctorID, Name, D_SpecialityID)
VALUES
    (101, '이메론', 1),
    (102, '오렌지', 2),
    (103, '짜장면', 3),
    (104, '정Johnson', 4);

#Nurse 테이블에 데이터
INSERT INTO Nurse (NurseID, Name, N_SpecialityID)
VALUES
    (501, '수간호', 4),
    (502, '김나나', 2),
    (503, '오무리', 3),
    (504, '나나', 1);

#Patient 테이블에 데이터
INSERT INTO Patient (PatientID, Name, SpecialityID, dob, DoctorID, NurseID)
VALUES
	('1001', '김사과', 1 ,840512, 101, 504),
	('1002', '알리오', 2,941201, 102, 502),
	('1003', '피막치', 3,781012, 103, 503);

 

위의 의사, 간호사, 환자는 예시 데이터입니다

 

결과:

환자 옵션:

1-3 옵션 실행 결과 및 환자 정보 삭제 부분에서 y를 누를 경우 결과:

병원 인사 관리 시스템
1. 환자
2. 의사
3. 간호사
4. 종료
원하는 작업을 선택하세요: 1
1. 환자 정보 추가
2. 환자 목록 조회
3. 환자 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 1
환자의 ID를 입력하세요: 1010
환자의 성과 이름을 입력하세요: 곽정우
환자의 생년월일 6자리를 입력하세요: 990318
환자의 담당 의사 ID를 입력하세요: 101
환자의 담당 간호사 ID를 입력하세요: 503
환자 정보가 성공적으로 추가되었습니다.
1. 환자 정보 추가
2. 환자 목록 조회
3. 환자 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 2
환자 목록(환자 ID, 이름, 생년월일, 의사ID, 간호사ID):
(1001, '김사과', 840512, 102, 503)
(1002, '알리오', 941201, 102, 501)
(1003, '피막치', 781012, 103, 502)
(1005, '벚꽃', 850202, 101, 503)
(1010, '곽정우', 990318, 101, 503)
1. 환자 정보 추가
2. 환자 목록 조회
3. 환자 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 3
삭제할 환자의 ID를 입력하세요: 1010
삭제할 환자 ID가 1010이 맞나요? (y/n): y
환자 정보가 삭제되었습니다.
1. 환자 정보 추가
2. 환자 목록 조회
3. 환자 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 2
환자 목록(환자 ID, 이름, 생년월일, 의사ID, 간호사ID):
(1001, '김사과', 840512, 102, 503)
(1002, '알리오', 941201, 102, 501)
(1003, '피막치', 781012, 103, 502)
(1005, '벚꽃', 850202, 101, 503)
1. 환자 정보 추가
2. 환자 목록 조회
3. 환자 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 4
1. 환자
2. 의사
3. 간호사
4. 종료
원하는 작업을 선택하세요: 4
병원 인사 관리 프로그램 종료.
.
.

종료 코드 0(으)로 완료된 프로세스

 

환자와 의사 및 간호사의 전문 분야가 모두 동일 할 경우 데이터베이스 등록
환자와 의사 및 간호사의 전문 분야가 다를 경우 등록 오류 발생(다른 병동일 경우를 가정)

병원 인사 관리 시스템
1. 환자
2. 의사
3. 간호사
4. 종료
원하는 작업을 선택하세요: 1
1. 환자 정보 추가
2. 환자 목록 조회
3. 환자 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 1
환자의 ID를 입력하세요: 1010
환자의 성과 이름을 입력하세요: 곽정우
환자의 전문 분야 ID를 입력하세요: 1
환자의 생년월일 6자리를 입력하세요: 1234556
환자의 담당 의사 ID를 입력하세요: 101
환자의 담당 간호사 ID를 입력하세요: 504
환자 정보가 성공적으로 추가되었습니다.
1. 환자 정보 추가
2. 환자 목록 조회
3. 환자 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 1
환자의 ID를 입력하세요: 1020
환자의 성과 이름을 입력하세요: 곽정
환자의 전문 분야 ID를 입력하세요: 1
환자의 생년월일 6자리를 입력하세요: 123456
환자의 담당 의사 ID를 입력하세요: 101
환자의 담당 간호사 ID를 입력하세요: 501
환자와 의사 및 간호사의 전문 분야와 일치하지 않습니다.

의사 옵션:

1-3번 옵션은 환자 및 간호사 옵션과 동일 및 의사 전용 옵션 4번 실행 결과:

병원 인사 관리 시스템
1. 환자
2. 의사
3. 간호사
4. 종료
원하는 작업을 선택하세요: 2
1. 의사 정보 추가
2. 의사 목록 조회
3. 의사 정보 삭제
4. 의사가 담당한 환자 조회
5. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 4
의사의 ID를 입력하세요: 102
의사 ID 102 담당 환자 정보:
(1001, '김사과', 840512, 102, 503)
(1002, '알리오', 941201, 102, 501)
1. 의사 정보 추가
2. 의사 목록 조회
3. 의사 정보 삭제
4. 의사가 담당한 환자 조회
5. 이전 메뉴로 돌아가기

 

간호사 옵션:

1-3 옵션 실행 결과 및 간호사 정보 삭제 부분에서 n을 누를 경우 결과:

병원 인사 관리 시스템
1. 환자
2. 의사
3. 간호사
4. 종료
원하는 작업을 선택하세요: 3
1. 간호사 정보 추가
2. 간호사 목록 조회
3. 간호사 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 1
간호사 ID를 입력하세요: 505
간호사의 성과 이름을 입력하세요: 코리아
담당 병동을 입력하세요: 성형
간호사 정보가 성공적으로 추가되었습니다.
1. 간호사 정보 추가
2. 간호사 목록 조회
3. 간호사 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 3
삭제할 간호사의 ID를 입력하세요: 505
삭제할 간호사 ID가 505이 맞나요? (y/n): n
삭제를 취소하였습니다.
1. 간호사 정보 추가
2. 간호사 목록 조회
3. 간호사 정보 삭제
4. 이전 메뉴로 돌아가기
원하는 작업을 선택하세요: 2
간호사 목록(간호사ID, 이름, 분야):
(501, '수간호', '성형')
(502, '김나나', '내과')
(503, '오무리', '심장')
(505, '코리아', '성형')
1. 간호사 정보 추가
2. 간호사 목록 조회
3. 간호사 정보 삭제
4. 이전 메뉴로 돌아가기