3. DB 생성

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 구조를 최대한 그대로 유지한다.
새 기능은
- 버튼 하나 추가
- 슬롯 메서드 하나 추가
동일한 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()
- DB 접속 정보 준비
- DB 서버 + 데이터베이스 연결
- 연결 상태 확인
- 커서 생성
- CREATE TABLE SQL 실행
- commit으로 변경 사항 반영
- 연결 종료
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. 실행
더보기
테스트 시나리오: 데이터베이스 생성
- 데이터베이스 연결 정보 및 생성할 데이터베이스명 입력
- 호스트, 사용자, 비밀번호를 올바르게 입력한다.
- 데이터베이스 이름에 새로 만들 이름을 입력한다.
예: school_db, demo_db
- 데이터베이스 생성 버튼을 클릭
- 성공하면
- 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를 삭제하는 경우는 없어 생략한다.
단계별 완성 파일