PyQt개발강좌, 데이터베이스 연동, SQLite와 MySQL을 이용한 데이터베이스 연결

PyQt는 Python을 사용하여 매우 강력하고 사용자 친화적인 GUI 애플리케이션을 개발할 수 있는 프레임워크입니다.
본 강좌에서는 PyQt를 사용하여 SQLite 및 MySQL 데이터베이스에 연결하고, 데이터를 조회하고, 추가, 수정 및 삭제하는 방법에 대해 알아보겠습니다.

목차

1. PyQt 소개

PyQt는 Qt 라이브러리의 Python 바인딩으로, 응용 프로그램 및 툴을 쉽고 빠르게 구축할 수 있는 도구입니다.
PyQt는 다양한 GUI 구성 요소(위젯)를 제공하여 직관적인 사용자 인터페이스를 제공하며,
다양한 플랫폼에서 동작합니다. PyQt를 사용하면 복잡한 GUI를 쉽게 설계하고,
사용자와 상호작용할 수 있는 풍부한 경험을 제공할 수 있습니다.

2. 데이터베이스 기초

데이터베이스는 데이터를 구조적으로 저장하고 관리할 수 있는 시스템입니다.
여기서는 두 가지 데이터베이스 시스템인 SQLite와 MySQL을 사용할 것입니다.
이 둘은 각각의 특징과 장점이 있으며, 애플리케이션의 요구 사항에 따라 선택할 수 있습니다.

2.1 SQLite

SQLite는 파일 기반의 관계형 데이터베이스입니다.
코딩 및 구현이 매우 간단하여, 소규모 프로젝트에 적합합니다.
SQLite는 서버가 필요 없으며, 데이터베이스가 하나의 파일로 저장되어 있어 이동이 용이합니다.

2.2 MySQL

MySQL은 보다 복잡한 웹 애플리케이션에 적합한 서버 기반의 관계형 데이터베이스 관리 시스템입니다.
데이터베이스 서버를 제공하여 네트워크를 통해 여러 클라이언트가 데이터에 접근할 수 있도록 합니다.
대규모 데이터 처리가 필요할 때 유용하게 사용할 수 있습니다.

3. SQLite와 PyQt 연동

SQLite와 PyQt를 통합하여 간단한 데이터베이스 애플리케이션을 만들어보겠습니다.
여기서는 데이터를 추가하고 조회하는 기본적인 예제 코드를 작성합니다.

3.1 SQLite 데이터베이스 설정

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QPushButton, QListWidget, QLabel
import sqlite3

class App(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.create_connection()

    def initUI(self):
        self.setWindowTitle('SQLite와 PyQt 연동')
        self.setGeometry(100, 100, 400, 400)
        
        self.layout = QVBoxLayout()
        
        self.label = QLabel('이름 입력:')
        self.layout.addWidget(self.label)
        
        self.input_name = QLineEdit(self)
        self.layout.addWidget(self.input_name)
        
        self.add_button = QPushButton('추가', self)
        self.add_button.clicked.connect(self.add_data)
        self.layout.addWidget(self.add_button)
        
        self.list_widget = QListWidget(self)
        self.layout.addWidget(self.list_widget)
        
        self.setLayout(self.layout)
        
    def create_connection(self):
        self.connection = sqlite3.connect('test.db')
        self.cursor = self.connection.cursor()
        self.cursor.execute('CREATE TABLE IF NOT EXISTS users (name TEXT)')
        
    def add_data(self):
        name = self.input_name.text()
        if name:
            self.cursor.execute('INSERT INTO users (name) VALUES (?)', (name,))
            self.connection.commit()
            self.input_name.clear()
            self.load_data()

    def load_data(self):
        self.list_widget.clear()
        self.cursor.execute('SELECT name FROM users')
        rows = self.cursor.fetchall()
        for row in rows:
            self.list_widget.addItem(row[0])
        
    def closeEvent(self, event):
        self.connection.close()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    ex.show()
    sys.exit(app.exec_())

3.2 코드 설명

위의 코드는 PyQt를 사용하여 SQLite 데이터베이스와 상호작용하는 간단한 애플리케이션입니다.
사용자는 입력 필드에 이름을 입력하고 “추가” 버튼을 클릭하여 데이터를
데이터베이스에 추가할 수 있고, 저장된 데이터를 리스트로 보여줍니다.
주요 기능은 다음과 같습니다.

  • 생성자: 데이터베이스 연결 및 UI 초기화를 수행합니다.
  • initUI: 기본적인 UI 레이아웃을 설정합니다.
  • create_connection: SQLite 데이터베이스에 연결하고 테이블을 생성합니다.
  • add_data: 입력한 이름을 데이터베이스에 추가하고 리스트를 업데이트합니다.
  • load_data: 데이터베이스에서 모든 이름을 가져와 리스트 위젯에 표시합니다.

4. MySQL과 PyQt 연동

이번 섹션에서는 MySQL과 PyQt를 연동하는 방법을 알아보겠습니다.
MySQL 데이터베이스에 연결하기 위해 mysql-connector-python 패키지를 사용합니다.
아래의 코드를 참고하여 MySQL 데이터베이스에 연결하고 데이터를 처리하는 예제를 만들어 보겠습니다.

4.1 MySQL 데이터베이스 설정

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QPushButton, QListWidget, QLabel
import mysql.connector

class App(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.create_connection()

    def initUI(self):
        self.setWindowTitle('MySQL과 PyQt 연동')
        self.setGeometry(100, 100, 400, 400)
        
        self.layout = QVBoxLayout()
        
        self.label = QLabel('이름 입력:')
        self.layout.addWidget(self.label)
        
        self.input_name = QLineEdit(self)
        self.layout.addWidget(self.input_name)
        
        self.add_button = QPushButton('추가', self)
        self.add_button.clicked.connect(self.add_data)
        self.layout.addWidget(self.add_button)
        
        self.list_widget = QListWidget(self)
        self.layout.addWidget(self.list_widget)
        
        self.setLayout(self.layout)
        
    def create_connection(self):
        self.connection = mysql.connector.connect(
            host='localhost',
            user='your_username',
            password='your_password',
            database='your_database'
        )
        self.cursor = self.connection.cursor()
        self.cursor.execute('CREATE TABLE IF NOT EXISTS users (name VARCHAR(255))')

    def add_data(self):
        name = self.input_name.text()
        if name:
            self.cursor.execute('INSERT INTO users (name) VALUES (%s)', (name,))
            self.connection.commit()
            self.input_name.clear()
            self.load_data()

    def load_data(self):
        self.list_widget.clear()
        self.cursor.execute('SELECT name FROM users')
        rows = self.cursor.fetchall()
        for row in rows:
            self.list_widget.addItem(row[0])
        
    def closeEvent(self, event):
        self.connection.close()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    ex.show()
    sys.exit(app.exec_())

4.2 코드 설명

위 코드는 MySQL 데이터베이스와 상호작용하기 위한 애플리케이션입니다.
SQLite 예제와 유사하지만 MySQL에 맞게 수정되었습니다.
코드의 중요한 부분은 다음과 같습니다.

  • 생성자: MySQL 데이터베이스에 연결합니다.
  • create_connection: MySQL DB에 연결하고 테이블을 생성합니다. 사용자 이름, 비밀번호, 데이터베이스 이름을 맞게 설정해야 합니다.
  • add_data: 입력한 이름을 MySQL 데이터베이스에 추가합니다.
  • load_data: 모든 이름을 MySQL에서 가져오고 리스트 위젯에 표시합니다.

5. 결론

본 강좌에서는 PyQt를 사용하여 SQLite 및 MySQL 데이터베이스와 연결하는 방법에 대해 설명하였습니다.
PyQt의 강력한 GUI 구성 요소와 함께 데이터베이스 연동을 통해 효율적인 데이터 관리를 구현할 수 있습니다.
다양한 데이터 처리 로직을 추가하여 더욱 발전된 애플리케이션을 만들어 볼 수 있습니다.
학습한 내용을 바탕으로 자신만의 프로젝트를 시작해 보시기 바랍니다.

© 2023 PyQt 개발 강좌