본문 바로가기
코딩/MySQL

DB를 이용한 단어장 만들기

by Song1234 2024. 3. 28.

DB를 이용한 단어장 만들기

import MySQLdb
class Words: # 데이터 입출력을 위한 클래스
    def __init__(self, eng, kor, lev=1):
        self.eng = eng
        self.kor = kor
        self.lev = lev
# set을 통해 데이터를 입력하고 get을 통해 출력을 한다
    def setEng(self, eng):
        self.eng = eng

    def getEng(self):
        return self.eng

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

    def getKor(self):
        return self.kor

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

    def getLev(self):
        return self.lev
class WordsDao:
# DAO (Data Access Object) 데이터 베이스와 상호작용을 위한 클래스 생성
    def __init__(self):
        self.db = None
        # 전역으로 사용할 db를 미리 생성한뒤 none값을 넣는다
    def connect(self):
        self.db = MySQLdb.connect('localhost', 'root', '1234', 'kdt')
		# connect메서드 를 통해 db에 접속
    def disconnect(self):
        self.db.close()
		# disconnect메서드 를 통해 연결해제
    def insert(self, word): # 데이터 입력을 위한 메서드
        self.connect()
        cur = self.db.cursor()
        sql = 'insert into voca (eng, kor, lev) values (%s, %s, %s)'
        data = (word.getEng(), word.getKor(), word.getLev()) # 입력받은 값을 get을 통해 값을 불러와 담아준다
        cur.execute(sql, data)
        self.db.commit()
        cur.close()
        self.disconnect()
		# DB에 입력후 종료
    def selectAll(self):
        self.connect()
        cur = self.db.cursor(MySQLdb.cursors.DictCursor)
        sql = 'select eng, kor, lev from voca order by eng asc'
        cur.execute(sql)
        row = cur.fetchall()
        cur.close()
        self.disconnect()
        return row
		# 딕셔너리형태로 값들을 불러온뒤 변수에 저장하고 리턴값으로 돌려준다
    def search(self, eng):# 검색을 위한 메서드
        self.connect()
        cur = self.db.cursor(MySQLdb.cursors.DictCursor)
        # sql = 'select eng, kor, lev from voca where eng=%s'
        sql = "select eng, kor, lev from voca where eng like concat('%%',%s,'%%')" # like를 통해 일부의 단어만 입력해도 검색이 되도록 해준다
        data = (eng,)
        cur.execute(sql, data)
        row = cur.fetchall()
        cur.close()
        self.disconnect()
        return row

    def update(self,word): # 수정메서드
        self.connect()
        cur = self.db.cursor()
        sql = "update voca set kor=%s, lev=%s where eng=%s" # 영단어를 통해 해당 데이터의 뜻과 레벨을 수정
        data = (word.getKor(), word.getLev(), word.getEng())
        result = cur.execute(sql, data)
        self.db.commit()
        if result > 0: # 수정된 결과가 없다면 에러 출력
            print('수정되었습니다')
        else:
            print('에러!')
        cur.close()
        self.disconnect()

    def delete(self, eng): # 삭제 메서드
        self.connect()
        cur = self.db.cursor()
        sql = 'delete from voca where eng=%s'
        data = (eng,)
        result = cur.execute(sql,data)
        self.db.commit()
        if result > 0:
            print('삭제되었습니다')
        else:
            print('오류!')
        cur.close()
        self.disconnect()
class WordsService: # 서비스를 위한 클래스
    def __init__(self): # 객체 생성과 함께 dao클래스를 호출해준다
        self.dao = WordsDao()

    def insertWord(self): # 단어 등록 메서드
        eng = input('단어를 입력하세요')
        kor = input('뜻을 입력하세요')
        lev = input('레벨을 입력하세요')
        word = Words(eng, kor, lev) 
        self.dao.insert(word)
		# input을 받아 word객체에 담은뒤 dao클래스의insert 메서드로 보내준다
    def printAll(self): # 저장된 단어들 출력을위한 메서드
        datas = self.dao.selectAll()
        for data in datas:
            print(f"{data['eng']}, 뜻:{data['kor']}, 레벨{data['lev']}")
		# dao클래스의 selectAll 메서드를 호출한뒤 for문을통해 하나씩 출력해준다
    def searchWord(self): # 단어 검색 메서드
        eng = input('검색할 단어를 입력하세요')
        datas = self.dao.search(eng) # 입력받은 값을 dao에 보내 리턴을 받아온다
        if datas:
            for data in datas:
                print(f"{data['eng']}, 뜻:{data['kor']}, 레벨{data['lev']}")
        else:
            print('찾는 단어가 없습니다')

    def editWord(self): # 단어 수정 메서드
        eng = input('수정할 단어를 입력하세요')
        word = self.dao.search(eng) # 우선 입력한 단어가 데이터 베이스에 있는지 먼저 검색
        if not word: 
            print('수정할 단어가 없습니다')
        else: # 단어가 있다면 새로운 값을 입력받아 dao.update 클래스로 보내서 수정해준다
            kor = input('새로운 뜻을 입력하세요')
            lev = input('새로운 레벨을 입력하세요')
            word = Words(eng, kor, lev)
            self.dao.update(word)

    def delWord(self): # 단어 삭제 메서드
        eng = input('삭제할 단어를 입력하세요')
        word = self.dao.search(eng) # 입력받은 단어 를 검색한다
        if not word:
            print('삭제할 단어가 없습니다')
        else: # 단어가 있다면 삭제진행
            self.dao.delete(eng)
class Menu: # 메뉴 실행을 위한 메서드
    def __init__(self):
        self.service = WordsService() # 객체가 생성되면 서비스클래스 호출

    def run(self): # 메뉴 선택 메서드
        while True:
            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:
                print(e)
                print('다시 입력하세요')
start = Menu()
start.run()
# 실행
1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기 1
단어를 입력하세요 melon
뜻을 입력하세요 메론
레벨을 입력하세요 4

1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기 2
apple, 뜻:사과, 레벨1
banana, 뜻:바나나, 레벨2
melon, 뜻:메론, 레벨4

1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기 3
검색할 단어를 입력하세요 pp
apple, 뜻:사과, 레벨1

1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기 4
수정할 단어를 입력하세요 melon
새로운 뜻을 입력하세요 수박
새로운 레벨을 입력하세요 6
수정되었습니다

1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기 2
apple, 뜻:사과, 레벨1
banana, 뜻:바나나, 레벨2
melon, 뜻:수박, 레벨6

1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기 5
삭제할 단어를 입력하세요 melon
삭제되었습니다

1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기 2
apple, 뜻:사과, 레벨1
banana, 뜻:바나나, 레벨2

1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기 6
프로그램을 종료합니다

'코딩 > MySQL' 카테고리의 다른 글

MySQL과 파이썬 연동  (0) 2024.03.28
MySQL 계정,사용자,권한 관리  (0) 2024.03.27
ER 다이어그램  (0) 2024.03.27
MySQL의 함수  (0) 2024.03.27
MySQL 기본문법  (2) 2024.03.26