Computer Science/Database

# 3 | PyQt와 sqlite3 연결하기

토마토. 2022. 1. 26. 15:50

1. sqlite3이란? 

다른 DBMS와 달리 서버를 구동하지 않고 응용 프로그램 내부에서 사용할 수 있는 DBMS이다.

파이썬에서 sqlite3 모듈을 불러와서 사용할 수 있다. 

 

sqlite3 모듈을 이용해서 데이터베이스를 생성해보자!

# 모듈을 불러온다. 
import sqlite3
print(sqlite3.version) # 모듈의 버전 2.6.0
print(sqlite3.sqlite_version) # sqlite의 버전

 

DB, 테이블 생성

# DB를 생성한다. 
con = sqlite3.connect('simpledb.sqlite')
print(type(con))

# 데이터 삽입
# connection 객체인 con을 이용해서 cursor 객체를 생성함
cursor = con.cursor()

 

테이블 구조

이름 : alarm

저장할 내용 : 요일 오전 오후 시간 분 과목이름 줌번호 패스워드 사운드여부

칼럼 이름 요일
day
시간(시/분)
hourmin
과목 이름
subject
줌번호
zoomid
패스워드
zoompw
사운드 여부
sound
데이터 타입 VARCHAR2(200 BYTE) VARCHAR2(200 BYTE) VARCHAR2(200 BYTE) NUMBER(10,2) NUMBER(10,2) NUMBER(10,2)
# 모듈을 불러온다. 
import sqlite3
print(sqlite3.version) # 모듈의 버전 2.6.0
print(sqlite3.sqlite_version) # sqlite의 버전

# DB를 생성한다. 
con = sqlite3.connect('simpledb.sqlite')
print(type(con))

# 데이터 삽입
# connection 객체인 con을 이용해서 cursor 객체를 생성함
cursor = con.cursor()

try:
    # 새로 테이블을 만들어야 하는 경우
    cursor.execute("CREATE table alarm(DAY VARCHAR2(200 BYTE), HOURMIN VARCHAR2(200 BYTE), SUBJECT VARCHAR2(200 BYTE), ZOOMID NUMBER(10,2), ZOOMPW NUMBER(10,2), SOUND NUMBER(10,2))")
except:
    # 그러지 않아도 되는 경우
    pass

cursor.execute("INSERT INTO alarm VALUES ('SUN', '12:25','교육학개론', 19230435, 0920, 0)")

cursor.fetchall()

con.commit()

for row in cursor.execute('SELECT * FROM alarm ORDER BY SOUND'):
    print(row)

con.commit()
con.close()

 

output

2.6.0
3.35.5
<class 'sqlite3.Connection'>
('SUN', '12:25', '교육학개론', 19230435, 920, 0)

 


2. pyqt와 sqlite3 연결하기

 

요구사항

가. pyqt에서 ok 버튼을 누르면, 해당 정보를 sqlite3에 저장한다. 

나. sqlite3에서 테이블 정보를 불러와서, 표로 나타낸다. 

=> 알고리즘

- sqlite3에 연결 > 조회(select)

- 표로 나타내기

 


 

가. pyqt에서 ok 버튼을 누르면, 해당 정보를 sqlite3에 저장한다.  를 수행한 과정

 

=> pyqt 모듈을 사용한다고 해서 크게 다를 것은 없다.

=> 알고리즘

- 작성 페이지가 나온다 (이때 설정값 모두 init 해주기)

- 작성 버튼/토굴/텍스트 등을 작성한다.

- ok 버튼을 누르면, 모든 input 요소를 저장해서

(이때 input 요소는 요일, 시간대, 시, 분, 과목 이름, 줌 id, 줌 비번, 소리 여부)

요일 -> self.clicked_days에 접근

시간대 -> self.clicked_times에 접근

시 ->  QComboBox의 .currentText() 매소드를 이용해서 받아올 것

분 -> QComboBox의 .currentText() 매소드를 이용해서 받아올 것

과목 이름 -> self.subjectName_input / QLineEdit()의 .text() 매소드를 이용해서 받아온다. 

줌 id -> self.zoomID_input / QLineEdit()의 .text() 매소드를 이용해서 받아온다. 

줌 비번 -> self.zoomPW_input / QLineEdit()의 .text() 매소드를 이용해서 받아온다. 

소리 여부 -> self.clicked_sounds에 접근

: 에러가 있는 경우, 에러 메시지를 보내고, 

: 에러가 없는 경우, (확인 메시지를 출력한 뒤에) sqlite3에 저장한다. 

 

소스 코드 

    def OK_clicked(self):
        # 데이터를 수집합니다. 
        day_data = self.clicked_days[0].text() # 요일
        
        time_data = self.clicked_times[0].text() # 오전 오후
        hour_data = int(self.hour.currentText())
        min_data = int(self.min.currentText())
        if time_data == 'AM':
            total_time_data = str(f'{hour_data}:{min_data}')
        else:
            total_time_data = str(f'{hour_data+12}:{min_data}')
        
        sound_data = self.clicked_sounds[0].text() # 소리 유무
        if sound_data == 'On':
            sound_data = 1 # on은 1
        else:
            sound_data = 0 # off는 0
        
        subject_data = self.subjectName_input.text() 
        id_data = int(self.zoomID_input.text())
        pw_data = int(self.zoomPW_input.text())

        print(day_data, total_time_data, subject_data, id_data, pw_data, sound_data)
        
        cursor.execute("INSERT INTO alarm VALUES (?, ?, ?, ?, ?, ?)", (day_data, total_time_data, subject_data, id_data, pw_data, sound_data) )
        cursor.fetchall()
        con.commit()

 

나. sqlite3에서 테이블 정보를 불러와서, 표로 나타낸다. 를 수행한 과정

=> 알고리즘

- sqlite3에 연결 > 조회(select)

- 표로 나타내기

 

원래 만들어둔 함수는 다음과 같았다. 

    def setTableWidgetData(self):
        self.dbTable.setItem(0,0,QTableWidgetItem("(0,0)"))
        self.dbTable.setItem(0,1,QTableWidgetItem("(0,0)"))
        self.dbTable.setItem(1,0,QTableWidgetItem("(0,0)"))
        self.dbTable.setItem(1,1,QTableWidgetItem("(0,0)"))

이 테이블에 sqlite db 내용을 반영하도록 하면, 

선택사항 결정 후 OK 버튼을 누르면, 

다음과 같은 화면이 뜬다. 

 

 


 

참고 자료

https://www.jbmpa.com/pyside2/7

https://www.tutorialspoint.com/pyqt/pyqt_database_handling.htm

https://docs.python.org/ko/3/library/sqlite3.html

https://wikidocs.net/5327

https://ichi.pro/ko/pyqt-mich-gwangyehyeong-deiteobeiseu-deiteo-hyeongsig-2-2337351792504

Handling SQL Databases With PyQt: The Basics – Real Python