728x90
반응형
SMALL
📌 DataBase를 이용하여 영어 단어장을 만드는 프로그램을 작성해보자.
(단, 영어 단어장은 MySQL 데이터베이스 테이블과 연동되어야 함)
1. MySQL에서 테이블 만들기
#단어장 테이블 생성
create table words(
eng varchar(50) primary key,
kor varchar(50) not null,
lev varchar(10)
2. DTO 클래스
- 순수한 데이터 객체
- getter/setter 메소드만 가짐
class Words:
def __init__(self, eng, kor, lev):
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 클래스
- 객체로 직접 DataBase에 접근하여 데이터를 삽입, 조회, 변경, 삭제(CRUD) 등을 조작할 수 있는 작업코드 구현
- DataBase에 접근하기 위해 MySQLdb 사용
- SQL에서 데이터를 다루는 기능을 구현함
import MySQLdb
class WordsDao:
def __init__(self):
self.conn = None # connect한 객체를 담을 변수
# DataBase에 접속
def connect(self):
self.db = MySQLdb.connect(host='localhost', user='root', password='1234', db='kdt')
# DataBase 커넥션 끊기
def disconnect(self):
self.db.close()
# 데이터 추가하는 기능
def insert(self, word):
self.connect() # db연결
cur = self.db.cursor() # 커서 생성
sql = "insert into words values (%s, %s, %s)" # 데이터 추가하는 sql 구문
data = (word.getEng(), word.getKor(), word.getLev()) # 메소드를 이용하여 프로퍼티 저장
cur.execute(sql, data) # data를 넣은 sql구문 실행
self.db.commit() # 반영
self.db.disconnect() # 커넥션 닫기
# 전체 데이터를 조회하는 기능
def selectAll(self):
self.connect() # db연결
cur = self.db.cursor() # 커서 생성
sql = "select eng, kor, lev from words" # 데이터를 조회하는 sql구문
cur.execute(sql)
row = fetchall() # sql 결과 전체 조회
self.disconnect() # 커넥션 닫기
return row # 전체 조회된 결과 값 반환
# 특정 데이터를 조회하는 기능
def search(self, eng): # 영어 단어를 입력받음
self.connect() # db연결
cur = self.db.cursor() # 커서 생성
sql = "select eng, kor, lev from words where eng=%s" # 특정 조건에 만족하는 데이터만 출력하는 sql구문
data = (eng, ) # 튜플에 하나의 값 입력시 , 같이 입력해야함!
cur.execute(sql, data)
row = cur.fetchone() # 하나의 데이터만 튜플로 출력
self.disconnect()
return row
# 데이터를 수정하는 기능
def update(self, word): # word객체를 매개변수로 입력받음
self.connect() # db연결
cur = self.db.cursor() # 커서 생성
sql = "update words set kor=%s, lev=%s where eng=%s" # 데이터를 수정하는 sql구문 작성
data = (word.getKor(), word.getLev(), word.getEng())
result = cur.execute(sql, data) # 수정 실행이 성공하면 수정된 데이터의 갯수 반환
self.db.commit() # 반영
if result > 0: # 정상적으로 수정이 되면
print('수정되었습니다.')
else:
print('해당 단어가 없습니다.')
self.db.disconnect() # 커넥션 닫기
# 데이터를 삭제하는 기능
def delete(self, eng): # 영어 단어를 매개변수로 받음
self.connect() # db연결
cur = self.db.cursor() # 커서 생성
sql = "delete from words where eng=%s" # 데이터를 삭제하는 sql구문 작성
data = (eng,)
result = cur.execute(sql, data)
self.db.commit()
if result > 0: # 정상적으로 삭제된 데이터의 갯수 반환
print('삭제되었습니다')
else:
print('해당 단어가 없습니다')
self.disconnect() # 커넥션 닫기
4. Service 클래스
- 실제로 단어장 테이블에 데이터를 삽입, 조회, 변경, 삭제(CRUD) 등을 하는 메소드를 구현
class WordsService:
def __init__(self):
self.dao = WordsDao() # 클래스 호출시 자동으로 WordsDao 클래스 객체 생성됨
# 단어장에 단어를 추가
def insertWord(self):
eng = input('단어를 입력하세요')
kor = input('뜻을 입력하세요')
lev = input('레벨을 입력하세요')
word = Words(eng, kor, lev) # Words 클래스로 객체 생성
self.dao.insert(word) # WordsDao 클래스의 insert 메소드로 구현
# 전체 단어를 출력
def printAll(self):
datas = self.dao.selectAll() # WordsDao 클래스의 selectAll 메소드로 구현
print(datas)
# 영어 단어를 통해 단어의 뜻과 레벨을 출력
def searchWord(self):
eng = input('검색할 단어를 입력하세요')
word = self.dao.search(eng) # WordsDao 클래스의 search 메소드로 구현
if word: # 입력받은 단어의 객체가 있으면
print(word) # word 객체를 출력
else:
print('찾는 단어가 없습니다')
# 영어 단어를 입력받아 뜻과 레벨을 수정
def editWord(self):
eng = input('수정할 단어를 입력하세요')
word = self.dao.search(eng) # WordsDao 클래스의 search 메소드로 구현
if word == None:
print('수정할 단어를 찾지 못했습니다')
else: # word 객체가 있으면
kor = input('새로운 뜻을 입력하세요')
lev = input('새로운 레벨을 입력하세요')
word = Words(eng, kor, lev) # 새로 입력받은 뜻과 레벨로 객체 생성
self.dao.update(word) # WordsDao 클래스의 update 메소드로 구현
# 단어를 삭제
def delWord(self):
eng = input('삭제할 단어를 입력하세요')
self.dao.delete(eng) # WordsDao 클래스의 delete 메소드로 구현
5. 프로그램 실행 클래스
class Menu:
def __init__(self): # 클래스 객체 생성시
self.service = WordsService() # 자동으로 WordsService 클래스 객체로 생성
def run(self):
while True:
try:
menu = int(input('1.등록하기 2.출력하기 3.검색하기 4.수정하기 5.삭제하기 6.종료하기'))
if menu == 1:
self.service.insertWord() # WordsService 클래스의 insertWord() 메소드 실행
elif menu == 2:
self.service.printAll() # WordsService 클래스의 printAll() 메소드 실행
elif menu == 3:
self.service.searchWord() # WordsService 클래스의 searchWord() 메소드 실행
elif menu == 4:
self.service.editWord() # WordsService 클래스의 editWord() 메소드 실행
elif menu == 5:
self.service.delWord() # WordsService 클래스의 delWord() 메소드 실행
elif menu == 6:
break
except Exception as e:
print(e)
print('다시 입력하세요')
start = Menu() # Menu클래스 객체 생성
start.run() # Menu클래스의 run()메소드 실행
📄 주피터 노트북으로 작성한 파일
728x90
반응형
LIST
'Python > Basic' 카테고리의 다른 글
[파이썬, Python] mysqlclient 을 이용하여 파이썬과 MySQL 연동하기! (0) | 2023.03.22 |
---|---|
[파이썬, Python] Pymysql 과 mysqlclient - SQL 커넥터 (0) | 2023.03.22 |
[파이썬, Python] DAO, DTO, VO란? & MVC 패턴 (0) | 2023.03.21 |
[파이썬, Python] 파이썬으로 파일 정리하기! 📂 (0) | 2023.03.14 |
[파이썬, Python] 파일 입출력 라이브러리 - 3️⃣ zlib, gzip, zipfile, tarfile_파이썬으로 파일 압축/압축 해제하기! (1) | 2023.03.14 |