1. 목표

더보기
  • mysql.connector를 사용해 MySQL 서버에 접속한 뒤 데이터베이스를 생성하는 기본 흐름을 이해한다.
  • PySide6 GUI 에서 데이터베이스 이름을 입력받아 CREATE DATABASE를 실행하는 기능을 구현한다.
  • try ~ except ~ mc.Error 패턴으로 예외를 처리하는 방법을 익힌다.
  • 생성 성공과 실패를 QLabel, QMessageBox로 사용자에게 안내하는 패턴을 익힌다.
  • 1단계에서 만든 host, user, password 입력 UI 구조를 그대로 활용하여 단계별 확장 구조를 학습한다.

 

2. 전체 로직

더보기
# ...

class MySqlDemoWindow(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("MySQL 연결 및 데이터베이스 생성")

        # ...

        self.btn_connect = QPushButton("연결 테스트")
        self.btn_create_db = QPushButton("데이터베이스 생성 (users)")  # 추가
        self.result_label = QLabel("연결 결과가 여기에 표시됩니다.")

        # ...

        self.btn_connect.clicked.connect(self.connect_to_database)
        self.btn_create_db.clicked.connect(self.create_database)  # 추가

        # ...

        main_layout = QVBoxLayout(self)
        main_layout.addLayout(form_layout)
        main_layout.addWidget(self.btn_connect)
        main_layout.addWidget(self.btn_create_db) # 추가
        main_layout.addWidget(self.result_label)
        
    def connect_to_database(self):

    # ...

    def create_database(self):  # 추가
        host = self.host_edit.text().strip()
        user = self.user_edit.text().strip()
        password = self.password_edit.text()
        db_name = self.db_edit.text().strip()

        if not host or not user or not db_name:
            QMessageBox.warning(self, "입력 오류", "호스트, 사용자, 데이터베이스 이름을 모두 입력해야 합니다.")
            return

        try:
            conn = mc.connect(
                host=host,
                user=user,
                password=password,
            )

            cursor = conn.cursor()
            cursor.execute(f"CREATE DATABASE {db_name}")
            conn.commit()

            msg = f"{db_name} 데이터베이스가 생성되었습니다."
            self.result_label.setText(msg)
            QMessageBox.information(self, "생성 완료", msg)

        except mc.Error as e:
            self.result_label.setText("데이터베이스 생성에 실패했습니다.")
            QMessageBox.critical(
                self,
                "생성 오류",
                f"데이터베이스 생성에 실패했습니다.\n오류 내용: {e}",
            )
        finally:
            try:
                if conn.is_connected():
                    conn.close()
            except Exception:
                pass
# main.py

import sys
from PySide6.QtWidgets import QApplication

from mainwindow import MySqlDemoWindow

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MySqlDemoWindow()
    w.show()
    sys.exit(app.exec())


3. 필요한 import + 주석 설명

더보기

동일


 

4. GUI 구현부 소스코드와 주석

더보기
class DbConnectWindow(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        # 윈도우 제목과 크기를 설정한다.
        self.setWindowTitle("MySQL 연결 및 데이터베이스 생성")
        self.resize(420, 280)

        # MySQL 접속 정보 입력 필드들을 만든다.
        self.host_edit = QLineEdit()      # 호스트 주소 입력, 예: localhost, 127.0.0.1
        self.user_edit = QLineEdit()      # 사용자 이름 입력, 예: root
        self.password_edit = QLineEdit()  # 비밀번호 입력
        self.password_edit.setEchoMode(QLineEdit.Password)  # 비밀번호를 화면에 숨김 모드로 표시한다.
        self.db_edit = QLineEdit()        # 데이터베이스 이름 입력

        # 학습 편의를 위해 host와 user에 기본값을 넣는다.
        self.host_edit.setText("localhost")
        self.user_edit.setText("root")

        # 라벨과 입력 칸을 한 줄씩 짝으로 배치하는 폼 레이아웃을 만든다.
        form_layout = QFormLayout()
        form_layout.addRow("호스트", self.host_edit)
        form_layout.addRow("사용자", self.user_edit)
        form_layout.addRow("비밀번호", self.password_edit)
        form_layout.addRow("데이터베이스 이름", self.db_edit)

        # 1단계에서 사용한 연결 테스트 버튼이다.
        self.btn_connect = QPushButton("연결 테스트")

        # 2단계에서 새로 추가한 데이터베이스 생성 버튼이다.
        self.btn_create_db = QPushButton("데이터베이스 생성 (users)")

        # 연결 또는 생성 결과를 간단히 출력할 라벨이다.
        self.result_label = QLabel("결과 메시지가 여기에 표시됩니다.")

        # 전체를 세로로 배치하는 메인 레이아웃을 만든다.
        main_layout = QVBoxLayout(self)
        main_layout.addLayout(form_layout)        # 위쪽: 입력 폼
        main_layout.addWidget(self.btn_connect)   # 중간: 연결 테스트 버튼
        main_layout.addWidget(self.btn_create_db) # 중간: 데이터베이스 생성 버튼
        main_layout.addWidget(self.result_label)  # 아래: 결과 표시 라벨

        # 시그널과 슬롯 연결은 아래 5번에서 설명한다.
        self.btn_connect.clicked.connect(self.connect_to_database)
        self.btn_create_db.clicked.connect(self.create_database)

1단계 GUI 구조를 최대한 그대로 유지한다.

 

새 기능은

  1. 버튼 하나 추가
  2. 슬롯 메서드 하나 추가

동일한 host, user, password, db_edit 필드를
connect_to_database와 create_database가 함께 사용한다.

이런 식으로 한 단계씩 추가해 확장한다.


 

5. 시그널과 슬롯 연결 부분

더보기
        # 데이터베이스 생성 버튼 클릭 시, CREATE DATABASE를 실행하는 함수와 연결한다.
        self.btn_create_db.clicked.connect(self.create_database)

 

btn_create_db.clicked

  • 2단계에서 새로 추가된 시그널
  • create_database 메서드와 연결해, 데이터베이스 생성 기능을 수행

 

6. <DB 생성> 주요 구조

더보기

6.1 <DB 생성> 핵심 요약

# 1. 연결
conn = mc.connect(서버_접속_정보)

# 2. 확인
if conn.is_connected():
    성공_처리()

# 3. SQL 실행
cursor = conn.cursor()
cursor.execute(SQL_쿼리)
conn.commit()

# 4. 종료
conn.close()

이 구조는

  • 데이터베이스 생성
  • 테이블 생성
  • 데이터 삽입/수정/삭제

모두에 공통으로 적용되는 기본 패턴입니다.

 

 

6.2 <DB 생성> 흐름

import mysql.connector as mc


def database_table_create_flow():
    # 1. DB 서버 접속에 필요한 정보 준비 (GUI에서 가져올 예정)
    host = "localhost"
    user = "root"
    password = "password"
    database = "test_db"

    # 2. MySQL 서버에 연결 (테이블은 DB 내부에 생성되므로 database 지정 필요)
    conn = mc.connect(
        host=host,
        user=user,
        password=password,
        database=database
    )

    # 3. 서버와 정상적으로 연결되었는지 확인
    if conn.is_connected():
        print("DB 연결 성공")

        # 4. SQL 실행을 위한 커서 생성
        cursor = conn.cursor()

        # 5. 테이블 생성 SQL 실행
        cursor.execute(
            """
            CREATE TABLE sample_table (
                id INT AUTO_INCREMENT PRIMARY KEY,
                name VARCHAR(50)
            )
            """
        )

        # 6. DB 구조 변경이므로 반드시 커밋 수행
        conn.commit()

    # 7. 모든 DB 작업이 끝난 후 연결 종료
    conn.close()


# DB 테이블 생성 흐름 실행
database_table_create_flow()
  1. DB 접속 정보 준비
  2. DB 서버 + 데이터베이스 연결
  3. 연결 상태 확인
  4. 커서 생성
  5. CREATE TABLE SQL 실행
  6. commit으로 변경 사항 반영
  7. 연결 종료

 

7. Table 생성 기능 구현 소스코드

더보기
    def create_database(self):
        # 1단계: 입력 필드에서 값 읽기
        host = self.host_edit.text().strip()
        user = self.user_edit.text().strip()
        password = self.password_edit.text()
        db_name = self.db_edit.text().strip()

        # 2단계: 데이터베이스를 생성하려면 호스트, 사용자, 데이터베이스 이름이 모두 필요하다.
        if not host or not user or not db_name:
            QMessageBox.warning(self, "입력 오류", "호스트, 사용자, 데이터베이스 이름을 모두 입력해야 합니다.")
            return

        try:
            # 3단계: 아직 db_name이 존재하지 않을 수 있으므로, database 파라미터 없이 서버에만 연결한다.
            conn = mc.connect(
                host=host,
                user=user,
                password=password,
            )

            # 4단계: SQL 실행용 커서를 생성한다.
            cursor = conn.cursor()

            # 5단계: CREATE DATABASE 쿼리를 실행한다.
            # db_name은 데이터베이스 이름으로 사용되므로, 실제 서비스에서는 허용 문자 검사 등을 추가하는 것이 안전하다.
            cursor.execute(f"CREATE DATABASE {db_name}")

            # 6단계: 변경 내용을 커밋한다.
            conn.commit()

            # 7단계: 성공 메시지를 구성하고 UI에 표시한다.
            msg = f"{db_name} 데이터베이스가 생성되었습니다."
            self.result_label.setText(msg)
            QMessageBox.information(self, "생성 완료", msg)

        except mc.Error as e:
            # 8단계: MySQL 관련 예외 처리
            # 이미 같은 이름의 데이터베이스가 존재하거나 권한 부족, 서버 문제 등이 있을 때 예외가 발생한다.
            self.result_label.setText("데이터베이스 생성에 실패했습니다.")
            QMessageBox.critical(
                self,
                "생성 오류",
                f"데이터베이스 생성에 실패했습니다.\n오류 내용: {e}",
            )
        finally:
            # 9단계: 연결 자원 정리
            try:
                if conn.is_connected():
                    conn.close()
            except Exception:
                pass

 

8. 실행

더보기

테스트 시나리오: 데이터베이스 생성

  1. 데이터베이스 연결 정보 및 생성할 데이터베이스명 입력
    • 호스트, 사용자, 비밀번호를 올바르게 입력한다.
    • 데이터베이스 이름에 새로 만들 이름을 입력한다.
      예: school_db, demo_db
  2. 데이터베이스 생성 버튼을 클릭
    • 성공하면
      • school_db 데이터베이스가 생성되었습니다 같은 메시지가 라벨과 팝업에 표시된다.
    • 이미 같은 이름의 데이터베이스가 있을 경우
      • 생성 실패 메시지와 함께 MySQL 오류 내용이 표시된다.

 

 

그 외 : WorkBench 에서 확인

  • MySQL Workbench, phpMyAdmin 또는 명령줄에서
    SHOW DATABASES;
    명령을 실행해 방금 생성한 데이터베이스가 목록에 있는지 확인한다.


9. 학습 주요 포인트

더보기
  • 1단계에서 구현한 connect_to_database 함수는 수정하지 않고 유지하고,
    2단계에서는 create_database 함수와 버튼만 추가하여 확장하는 구조로 설계

  • 같은 입력 필드(host, user, password, database)를 활용해
    연결 테스트와 데이터베이스 생성 두 기능을 모두 구현

  • CREATE DATABASE를 실행할 때는 아직 DB가 없으므로
    mysql.connector.connect에서 database 파라미터를 사용하지 않음

  • 두 메서드 모두 try except finally 패턴을 사용해
    예외 상황과 자원 정리를 동일한 스타일로 구현했

  • 이 통합 창 구조는 이후 단계에서
    테이블 생성, INSERT, SELECT, 로그인 기능 등을
    같은 클래스 안에 메서드와 버튼을 추가하는 방식으로
    자연스럽게 확장해 나가도록 구성

  • DB 생성과 반대되는 DB 삭제(DROP)의 경우, APP 단에서 DB를 삭제하는 경우는 없어 생략한다.

 

단계별 완성 파일