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()