간단한 Member 라는 테이블을 만들어서 Name 으로 검색하고 결과를 출력하는 기능을 추가하겠습니다.
1) 코드 생성
Database 는 간단하게 파일로 생성할 수 있는 SQLite 를 사용하였습니다.
ChatGPT 에 사용한 프롬프트입니다.
pyqt5 로 실행 시 window 에 다음을 추가해주세요.
첫째 라인 : Meber Name 라는 GroupBox 로 둘러싸인 LineEdit, Search 버튼
둘째 라인 : Name, Age 이라는 Column 을 가지는 Grid
초기 실행 시 SQLite members.db 를 존재하지 않으면 생성하고 Member 테이블을 생성한 후에 테스트 데이터를 추가합니다.
테스트 데이터에는 Name 이 값은 Member 도 여러명 존재하고 Name 이 고유한 데이터도 존재해야 합니다.
SQLine 에 String Name, Intger Age 라는 Member 테이블을 만듭니다.
Seach 버튼을 클릭하면 SqlAlchemy 로 Member 테이블을 검색하여 Member Name LineEdit 에 입력된 값으로 검색하여 Name 이 일치하는
레코드를 찾습니다.
일치하는 데이터를 찾으면 Grid 에 Name, Age 를 추가합니다.
생성된 코드는 다음과 같습니다.
위 코드는 아래 git 에서도 다운받을 수 있습니다.
git clone git@github.com:jbpark/jbDeskExample.git
cd jbDeskExample/jbDesk/ch2.1
search_database.py
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QGroupBox, QLineEdit, QPushButton, QTableWidget, \
QTableWidgetItem, QHBoxLayout
from sqlalchemy import create_engine, Column, Integer, String, select
from sqlalchemy.orm import declarative_base, sessionmaker
import os
# 데이터베이스 설정
DATABASE_URL = "sqlite:///members.db"
engine = create_engine(DATABASE_URL, echo=True)
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
# Member 테이블 정의
class Member(Base):
__tablename__ = "members"
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
age = Column(Integer, nullable=False)
# 데이터베이스 및 테이블 생성 (존재하지 않으면 생성)
if not os.path.exists("members.db"):
Base.metadata.create_all(engine)
# 테스트 데이터 추가
def add_test_data():
test_members = [
Member(name="Alice", age=30),
Member(name="Alice", age=28),
Member(name="Bob", age=25),
Member(name="Charlie", age=35),
Member(name="David", age=40)
]
session.add_all(test_members)
session.commit()
add_test_data()
class MemberSearchApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
main_layout = QVBoxLayout()
# 첫째 라인: Member Name GroupBox + Search 버튼
name_layout = QHBoxLayout()
self.name_group = QGroupBox("Member Name")
self.name_input = QLineEdit()
group_layout = QVBoxLayout()
group_layout.addWidget(self.name_input)
self.name_group.setLayout(group_layout)
self.search_button = QPushButton("Search")
self.search_button.clicked.connect(self.search_member)
name_layout.addWidget(self.name_group)
name_layout.addWidget(self.search_button)
main_layout.addLayout(name_layout)
# 둘째 라인: Grid Table (Name, Age)
self.table = QTableWidget()
self.table.setColumnCount(2)
self.table.setHorizontalHeaderLabels(["Name", "Age"])
main_layout.addWidget(self.table)
self.setLayout(main_layout)
self.setWindowTitle("Member Search")
self.setGeometry(100, 100, 400, 300)
def search_member(self):
name = self.name_input.text().strip()
if not name:
return
# SQLAlchemy 검색
stmt = select(Member).where(Member.name == name)
results = session.execute(stmt).scalars().all()
self.table.setRowCount(len(results))
for index, member in enumerate(results):
self.table.setItem(index, 0, QTableWidgetItem(member.name))
self.table.setItem(index, 1, QTableWidgetItem(str(member.age)))
if __name__ == "__main__":
app = QApplication([])
window = MemberSearchApp()
window.show()
app.exec_()
이제 UI가 다음과 같이 변경되었습니다:
첫째 라인
"Member Name"을 포함하는 QGroupBox 내에 QLineEdit
Search 버튼
둘째 라인
QTableWidget을 사용해 "Name", "Age" 컬럼을 포함하는 그리드
기능 추가
SQLite 데이터베이스 members.db를 생성하고 Member 테이블을 설정
테스트 데이터 추가 (동일한 Name을 가진 여러 레코드 포함)
Search 버튼 클릭 시 Name으로 검색하여 그리드에 일치하는 레코드 표시
2) 코드 실행
SQLAlchemy 를 사용하므로 패키지를 실행전에 패키지를 설치해야 합니다.
pip install sqlalchemy
생성된 테스트 데이터를 보면 Alice 로 Name 이 동일한 Member 가 여러명 있는 것을 확인할 수 있습니다.
검색 시 아래와 같이 모든 Member 가 Grid 에 표시됨을 확인 할 수 있습니다.
코딩이 정말 쉽지 않나요?
아라비안 나이트에 알라딘의 요술램프가 있다면 요즘은 ChatGPT 같은 인공 지능 요술램프가 있는 것 같습니다.
@echo off
set CONDA_ENV_NAME=jbdesk38_64
:: Conda 활성화
call conda activate base
:: Conda 환경 목록 확인 후 존재하지 않으면 생성
conda info --envs | findstr /C:"%CONDA_ENV_NAME%" >nul
if %errorlevel% neq 0 (
echo Creating conda environment: %CONDA_ENV_NAME%
conda create -y -n %CONDA_ENV_NAME% python=3.8
)
:: Conda 환경 활성화
call conda activate %CONDA_ENV_NAME%
:: PyQt5 설치
pip show PyQt5 >nul 2>nul
if %errorlevel% neq 0 (
echo Installing PyQt5...
pip install PyQt5
)
:: pytz 설치
pip show pytz >nul 2>nul
if %errorlevel% neq 0 (
echo Installing pytz...
pip install pytz
)
:: sqlalchemy 설치
pip show sqlalchemy >nul 2>nul
if %errorlevel% neq 0 (
echo Installing sqlalchemy...
pip install sqlalchemy
)
:: jbdesk.py 실행
python jbdesk.py