DBMS

DBMS(9)-DB를 이용한 단어장 만들기

두설날 2024. 3. 28. 17:29

*이 글을 읽기전에 작성자 개인의견이 있으니, 다른 블로그와 교차로 읽는것을 권장합니다.*

파이썬으로 만든 단어장을 이용해 database와 연결하는 프로그램을 만듭니다.

# mysqlclient설치
!pip install mysqlclient

# MySQLdb 모듈설치
import MySQLdb
# eng, kor, lev 저장하는 생성자 함수 class문 Words객체 생성
class Words:
    def __init__(self,eng,kor,lev=1):
        self.eng=eng	#eng값->self.eng에 저장
        self.kor=kor	#kor값->self.kor에 저장
        self.lev=lev	#lev값->self.lev에 저장

    def setEng(self,eng):
        self.eng=eng	

    def getEng(self):
        return self.eng	#self.eng 반환

    def setKor(self,kor):
        self.kor=kor

    def getKor(self):
        return self.kor	#self.kor 반환

    def setLev(self,lev):
        self.lev=lev

    def getLev(self):
        return self.lev	#self.lev 반환
# WordsDao객체 생성
class WordsDao:	#database table의 class문 WordsDao객체 
    def __init__(self):	#self.db의 초기 메모리값 None 반환하도록 설정
        self.db=None
    def connect(self):	#database 연결함수
        self.db=MySQLdb.connect('localhost','root','1234','kdt')	#'kdt' database에 연결
    def disconnect(self):	#database 연결중단 함수
        self.db.close()	#'kdt' database 연결중단
    def insert(self,word):	# word변수에 class객체값 저장(추가)하기
        self.connect()	#MySQLdb.connect('localhost','root','1234','kdt') 발동
        cur = self.db.cursor()	#커서객체 설정
        sql = 'insert into voca (eng, kor, lev) values (%s, %s,%s)' #추가문 설정
        data = (word.getEng(), word.getKor(), word.getLev())	#반환값 변수 설정
        cur.execute(sql,data)	#추가문+리턴값 실행메서드
        self.db.commit()	#데이터베이스에 저장
        cur.close()	#커서 닫기
        self.disconnect()	#데이터베이스 연결해제

    def selectAll(self):	#읽기(출력)
        self.connect()	#database 연결
        cur=self.db.cursor(MySQLdb.cursors.DictCursor) #database 딕셔너리형자료 지정
        sql = 'select eng, kor, lev from voca order by eng asc'	#eng오름차순으로 eng,kor,lev 읽기
        cur.execute(sql)	#sql 실행
        row = cur.fetchall()	#모든 딕셔너리자료값 행 출력
        cur.close()	#커서닫기
        self.disconnect()	#database 닫기
        return row	#처리된 행 반환(리턴)

    def search(self,eng):	#eng 수정됐는지 검색 함수
        self.connect()	#database 연결
        cur = self.db.cursor(MySQLdb.cursors.DictCursor)	#딕셔너리자료형 커서
        #select eng, kor, lev from voca where eng like '%pp%';
        #sql ='select eng,kor,lev from voca where eng=%s'
        sql = "select eng, kor, lev from voca where eng like concat('%%',%s,'%%')"
        # 수정된 eng가 결합된 class에서 eng,kor,lev 읽기(출력)
        data = (eng,)	#eng 튜플형 1개만 설정
        cur.execute(sql,data)	#sql실행
        row=cur.fetchall()	#모든 행 지정
        cur.close() #커서 닫기
        self.disconnect()	#database닫기
        return row	#행을 리턴
    def update(self, word):	#word변수 수정하는 함수
        self.connect()	#database연결
        cur = self.db.cursor()	#커서
        sql = 'update voca set kor=%s, lev=%s where eng=%s'	#eng가 해당 class로 나올경우, kor,lev수정
        data = (word.getKor(), word.getLev(), word.getEng())	#word변수에 저장된 kor,lev,eng값 리턴
        result = cur.execute(sql,data)	#리턴된 word class 쿼리로 실행
        self.db.commit()	#database 저장
        if result > 0:	# 행 수정 완료
            print('수정되었습니다')
        else:	#행 수정 못함
            print('에러!')
        cur.close()	#커서닫
        self.disconnect()	#database닫
    def delete(self,eng):	#eng 삭제함수
        self.connect()	#database 연결
        cur = self.db.cursor()	#커서
        sql = 'delete from voca where eng=%s'	#eng입력된 값 삭제
        data = (eng,)	#eng만 해당
        result = cur.execute(sql,data)	#쿼리 실행
        self.db.commit()	#database저장
        if result > 0:	#삭제완료
            print('삭제되었습니다')
        else:	#삭제못함
            print('오류!')
        cur.close()	#커서닫
        self.disconnect()	#database닫
class WordsService:	#word클래스를 입력,검색,수정,삭제하는 걸 WordService 객체안에 저장
    def __init__(self):	# Wordsdao()를 self.dao에 저장하는 생성자함수
        self.dao=WordsDao()

    def insertWord(self):	#word변수안에 클래스 입력하는 함수
        eng = input('단어를 입력하세요')	#eng입력
        kor = input('뜻을 입력하세요')	#kor입력
        lev = input('레벨을 입력하세요')	#lev입력
        word = Words(eng, kor, lev)	# 위에 입력한 것들 word변수안에 저장
        self.dao.insert(word)	#저장한 word객체값
    def printAll(self):	#등록(저장)한 word클래스 값 출력하는 함수
        datas = self.dao.selectAll()	#전체 출력->datas변수에 저장
        for data in datas:	#eng,kor,lev저장한 클래스 반복문
            print(f"단어:{data['eng']}, 뜻:{data['kor']}, 레벨:{data['lev']}") 
    #f-String을 사용할때 따옴표는 안,바깥을 구분해두어여 함.
    # 등록한 word값들 전부 출력
    def searchWord(self):	#입력한 Word클래스를 검색하는 함수
        eng = input('검색할 단어를 입력하세요')	#eng검색
        data = self.dao.selectAll(eng)	#word클래스를 검색->data변수에 저장
        if datas:	#datas변수 if문
            for data in datas:	#datas변수안에서 data라는이름으로 변수 출력
                print(f"단어:{data['eng']}, 뜻:{data['kor']}, 레벨:{data['lev']}")
                #출력
        else:
            print('찾는 단어가 없습니다.')	#요청한 word클래스 없음
    def editWord(self):	#eng를 기준으로 word클래스 수정하는 함수
        eng = input('수정할 단어를 입력하세요')	#eng수정하기
        word = self.dao.search(eng)	#eng검색하기
        if not word:	#word안에 요청한 eng가 없을때
            print('수정할 단어가 없습니다')
        else:	#word안에 요청한 eng가 있을때
            kor = input('새로운 뜻을 입력하세요')	#kor 수정하기
            lev = input('새로운 레벨을 입력하세요')	#lev수정하기
            word = Words(eng, kor ,lev)	#요청한 eng의 kor,lev수정한 걸 word안에 저장
            self.dao.update(word)	#kor,lev수정 완료한 걸 word안에 저장
    def delWord(self):	#검색해서 나온 eng가 있는 Word클래스 삭제하는 함수
        eng = input('삭제할 단어를 입력하세요')	#삭제할 eng입력
        word = self.dao.search(eng)	#검색한 eng를 word에 저장
        if not word:	#eng검색한게 없을때
            print('삭제할 단어가 없습니다')
        else:	#검색한 eng가 있을 때 삭제
            self.dao.delete(eng)
# 1~6번까지 실행하는 class문 Menu객체 생성
class Menu:
    def __init__(self):	# 생성자함수
        self.service = WordsService()	# WordService객체에 있는 기능을 self.service에 저장
    def run(self):
        while True:	#while True는 무한반복문, True값일때 계속반복, False값일때 반복실행
            try:	#예외처리
                menu = int(input('1.등록하기 2. 출력하기 3. 검색하기 4.수정하기 5. 삭제하기 6. 종료하기'))
                if menu == 1:
                    self.service.insertWord()
                elif menu ==2:
                    self.service.printAll()
                elif menu ==3:
                    self.service.searchWord()
                elif menu ==4:
                    self.service.editWord()
                elif menu ==5:
                    self.service.delWord()
                elif menu ==6:
                    print('프로그램을 종료합니다')
                    break
            except Exception as e:	#모든 예외처리 타입을 alias e로 처리
                print(e)	#alias e 출력
                print('다시 입력하세요')
# Menu class 실행 객체
start = Menu()
start.run()

확인