Python/개요 및 문법

SQL 연동 단어장 예제

Bambi97 2024. 10. 14. 16:31

1. MySQLdb 라이브러리 import

import MySQLdb

 

2. DTO (Data Transfer Object)

*DTO란?

- DataTransferObject의 약자

- 통신할 때 묶어서 사용되는 데이터의 묶음 상자

class Words:
    
    def __init__(self, eng, kor, lev=1):
        self.eng = eng
        self.kor = kor
        self.lev = lev
        
    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

 

3. DAO (Data Access Object)

*DAO란?

- DataAccessObject의 약자

- connection 생성, 끊기

- CRUD(등록, 조회, 수정, 삭제) 기능

class WordsDao:
    def __init__(self):
        self.db = None

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

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

    def insert(self, word):
        pass

    def selectAll(self):
        pass
        
    def search(self, eng):
        pass

    def update(self, word):
        pass

    def delete(self, eng):
        pass

 

4. 서비스 (Service) Class

메인 코드라고 볼 수 있는 실제 비지니스 로직이 담겨있는 클래스

class WordsService:
    def __init__(self):
        self.dao = WordsDao()
    def insertWord(self):
        eng = input('단어를 입력하세요')
        kor = input('뜻을 입력하세요')
        lev = input('레벨을 입력하세요')

        word = Words(eng, kor, lev)
        self.dao.insert(word)

    def printAll(self):
        datas = self.dao.selectAll()
        for data in datas:
            print(f"{data['eng']}, 뜻: {data['kor']}, 레벨: {data['lev']}")

    def searchWord(self):
        eng = input('검색할 단어를 입력하세요.').strip()
        datas = self.dao.search(eng)
        if datas:
            for data in datas:
                print(f"{data['eng']}, 뜻: {data['kor']}, 레벨: {data['lev']}")
        else:
            print('찾는 단어가 없습니다')

    def editWord(self):
        eng = input('수정할 단어를 입력하세요').strip()
        word = self.dao.search(eng)
        if not word:
            print('수정할 단어가 없습니다.')
        else:
            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)

→ 메인 로직이 정해졌으니 위 DAO 클래스의 내용을 정의한다.

class WordsDao:
    def __init__(self):
        self.db = None

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

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

    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())
        cur.execute(sql, data)
        self.db.commit()
        cur.close()
        self.disconnect()

    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 like concat('%%', %s, '%%')"
        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'
        result = cur.execute(sql, (eng, ))
        self.db.commit()
        if result > 0:
            print('삭제되었습니다')
        else:
            print('에러!')
        cur.close()
        self.disconnect()

 

 

5. 메인 코드

class Menu:
    def __init__(self):
        self.service = WordsService()
        
    def run(self):
        while True:
            try:
                menu = int(input('1.등록 2.출력 3.검색 4.수정 5.삭제 6.종료').strip())
                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)

menu = Menu()
menu.run()	# 메인코드인 무한루프가 시작된다.

 

'Python > 개요 및 문법' 카테고리의 다른 글

개요  (1) 2024.10.15
파이썬과 MySQL 연동  (1) 2024.10.14
디렉토리 관리 프로그래밍  (1) 2024.10.07
파일 입출력 모드  (4) 2024.10.02
변수 타입 어노테이션  (1) 2024.10.02