PyQt개발강좌, 데이터베이스 연동, QSqlTableModel, QSqlQueryModel을 통한 데이터 표시

Python은 다양한 GUI 툴킷을 제공하며, 그 중 PyQt는 강력한 기능과 직관적인 디자인으로 많은 개발자들에게 사랑받고 있습니다. 이번 강좌에서는 PyQt를 사용하여 데이터베이스와의 연동 방법에 대해 알아보고, QSqlTableModel 및 QSqlQueryModel을 사용하여 데이터베이스의 데이터를 어떻게 표시할 수 있는지에 대해 심층적으로 다루겠습니다.

1. PyQt 소개

PyQt는 C++로 작성된 Qt 프레임워크를 Python에서 사용할 수 있도록 만들어진 바인딩입니다. PyQt는 다양한 플랫폼에서 사용할 수 있으며, 멀티미디어, 그래픽스, 네트워크 기능을 포함한 고급 GUI를 쉽게 만들 수 있게 해줍니다.

2. 데이터베이스 연동 개요

현대 애플리케이션에서는 데이터 저장과 관리를 위해 데이터베이스를 사용하는 것이 일반적입니다. PyQt는 SQLite, MySQL, PostgreSQL 등의 데이터베이스와 쉽게 연결할 수 있는 API를 제공합니다. 본 강좌에서는 SQLite를 사용하여 데이터베이스 연동을 설명하겠습니다.

3. QSqlTableModel 및 QSqlQueryModel 소개

QSqlTableModel은 지정된 데이터베이스 테이블의 내용을 모델로 생성하여, QTableView와 같은 뷰와 쉽게 연결할 수 있도록 합니다. 반면, QSqlQueryModel은 SQL 쿼리의 결과를 바탕으로 데이터를 표시하는 데 사용됩니다. 두 모델 모두 MVC 패턴에 따라 작동하여 데이터의 표현과 비즈니스 로직을 분리합니다.

3.1 QSqlTableModel

QSqlTableModel은 특정 테이블의 행과 열을 자동으로 관리하며, 테이블의 내용을 수정, 추가, 삭제하는 기능을 제공합니다. 이를 통해 사용자는 데이터베이스와의 상호작용을 더욱 쉽고 효율적으로 처리할 수 있습니다.

3.2 QSqlQueryModel

QSqlQueryModel은 개발자가 작성한 SQL 쿼리의 결과를 바탕으로 데이터를 표시하는 데 유용합니다. 이 모델의 장점은 복잡한 쿼리를 처리하거나, 테이블의 관계를 간단하게 표현할 수 있다는 점입니다.

4. 프로젝트 설정

우선 PyQt5를 설치해야 합니다. 다음 명령어를 사용하여 PyQt5와 SQLite 드라이버를 설치할 수 있습니다:

pip install PyQt5 PyQt5-sip

이제 프로젝트 구조를 정의하고 데이터베이스를 생성하겠습니다. 아래 코드는 SQLite 데이터베이스를 생성하고 샘플 테이블을 추가하는 역할을 합니다.

import sqlite3

def create_database():
    connection = sqlite3.connect('example.db')
    cursor = connection.cursor()
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS users (
            id INTEGER PRIMARY KEY,
            name TEXT NOT NULL,
            age INTEGER
        )
    ''')
    cursor.execute("INSERT INTO users (name, age) VALUES ('Alice', 30)")
    cursor.execute("INSERT INTO users (name, age) VALUES ('Bob', 25)")
    connection.commit()
    connection.close()

if __name__ == "__main__":
    create_database()

5. PyQt 애플리케이션 구현

이제 PyQt 애플리케이션을 설정해보겠습니다. 다음 코드에서는 QSqlTableModel을 사용하여 데이터베이스의 내용을 QTableView에 표시합니다.

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableView, QVBoxLayout, QWidget, QPushButton
from PyQt5.QtSql import QSqlDatabase, QSqlTableModel

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt 데이터베이스 연동 예제")
        self.setGeometry(100, 100, 600, 400)

        self.model = QSqlTableModel(self)
        self.initialize_database()
        self.model.setTable("users")
        self.model.select()

        self.table_view = QTableView()
        self.table_view.setModel(self.model)

        add_button = QPushButton("Add User")
        add_button.clicked.connect(self.add_user)

        layout = QVBoxLayout()
        layout.addWidget(self.table_view)
        layout.addWidget(add_button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def initialize_database(self):
        db = QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName("example.db")
        if not db.open():
            print("Couldn't open the database.")

    def add_user(self):
        self.model.insertRow(self.model.rowCount())
        self.model.setData(self.model.index(self.model.rowCount() - 1, 1), "New User")
        self.model.setData(self.model.index(self.model.rowCount() - 1, 2), 20)
        self.model.submitAll()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

5.1 애플리케이션 실행

이제 위 코드를 실행하면 QTableView에 데이터베이스의 사용자 정보를 표시하는 PyQt 애플리케이션이 실행됩니다. 사용자는 ‘Add User’ 버튼을 클릭하여 새로운 사용자를 추가할 수 있습니다.

6. QSqlQueryModel을 사용한 예제

이번에는 QSqlQueryModel을 사용하여 특정 조건에 맞는 데이터를 표시하는 방법을 소개하겠습니다. 아래 코드는 QSqlQueryModel을 사용하여 나이가 25세 이상인 사용자만 표시하는 예제입니다.

class QueryMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QSqlQueryModel 예제")
        self.setGeometry(100, 100, 600, 400)

        self.model = QSqlQueryModel(self)
        self.initialize_database()
        self.model.setQuery("SELECT * FROM users WHERE age >= 25")

        self.table_view = QTableView()
        self.table_view.setModel(self.model)

        layout = QVBoxLayout()
        layout.addWidget(self.table_view)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def initialize_database(self):
        db = QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName("example.db")
        if not db.open():
            print("Couldn't open the database.")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    query_window = QueryMainWindow()
    query_window.show()
    sys.exit(app.exec_())

6.1 애플리케이션 실행

위 코드를 실행하면 QSqlQueryModel을 통해 나이가 25세 이상인 사용자 정보를 표시하는 애플리케이션입니다. 사용자 조건을 변경하려면 SQL 쿼리를 수정하면 됩니다.

7. 데이터베이스에서 데이터 삭제 및 수정

사용자 인터페이스에서 데이터를 수정하거나 삭제할 수도 있습니다. TableView와 함께 모델을 사용하면 이 작업이 더욱 간단해집니다. 아래 코드는 QSqlTableModel을 사용하여 특정 사용자를 삭제할 수 있는 기능을 추가합니다.

class DeleteUserMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("사용자 삭제 예제")
        self.setGeometry(100, 100, 600, 400)

        self.model = QSqlTableModel(self)
        self.initialize_database()
        self.model.setTable("users")
        self.model.select()

        self.table_view = QTableView()
        self.table_view.setModel(self.model)

        delete_button = QPushButton("Delete Selected User")
        delete_button.clicked.connect(self.delete_user)

        layout = QVBoxLayout()
        layout.addWidget(self.table_view)
        layout.addWidget(delete_button)

        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def initialize_database(self):
        db = QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName("example.db")
        if not db.open():
            print("Couldn't open the database.")

    def delete_user(self):
        selected_index = self.table_view.currentIndex()
        if selected_index.isValid():
            self.model.removeRow(selected_index.row())
            self.model.submitAll()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    delete_window = DeleteUserMainWindow()
    delete_window.show()
    sys.exit(app.exec_())

7.1 애플리케이션 실행

위 코드를 실행한 후 QTableView에서 특정 사용자를 선택하고 ‘Delete Selected User’ 버튼을 클릭하여 해당 사용자를 데이터베이스에서 삭제할 수 있습니다.

8. 결론

이 강좌에서는 PyQt를 사용하여 SQLite 데이터베이스와의 연동, 그리고 QSqlTableModel 및 QSqlQueryModel을 통해 데이터를 표시하는 방법을 배웠습니다. 데이터베이스와의 통신은 대부분의 현대 애플리케이션에서 중요하며, PyQt의 강력한 데이터 모델링 기능을 활용하면 이를 효율적으로 처리할 수 있습니다.

더 많은 기능을 추가하고 싶다면, 사용자 검색, 데이터 필터링, 정렬 등과 같은 기능을 구현해 보세요. PyQt와 SQLite를 활용하여 여러분만의 애플리케이션을 만들어 보는 것을 권장합니다.

이 강좌가 PyQt 개발에 도움이 되었기를 바랍니다. 더 많은 학습 자료와 정보는 PyQt 공식 문서와 커뮤니티에서 찾아보세요.

참고 자료