본문 바로가기
Study

[SQL] Chapter 8. (21~23강)

by Hwanin99 2025. 7. 8.

SQL과 Python 연결 준비

  • Python 프로그래밍을 위해서는 개발 환경을 구축해야 한다.
    • Python에는 MySQL을 인식하는 기능이 없으므로 PyMySQL이라는 외부 라이브러리도 설치해야 한다.
    • MySQL과 Python을 연동해서 프로그래밍하면, MySQL 전문가가 할 수 있는 기능들을 일반 사용자도 손쉽게 사용할 수 있다.

 

  • Python이 없다면 설치를 해주고, CMD 창에서 'pip install pymysql'으로 외부 라이브러리를 설치하면 된다.
    • Anaconda의 Jupyter Notebook을 사용하고 있다면, 여기에 바로 pymysql을 설치하면 된다.

22강.

MySQL과 Python 연동

  • Python을 사용해서 다음과 같은 database를 만들어 보자.

 

  • 우선 MySQL Workbench에서 soloDB 데이터베이스를 만든다.
CREATE DATABASE soloDB

 

  • 이제 파이썬을 통해 userTable을 만들고 값을 넣어준다.
import pymysql


conn = pymysql.connect(host='127.0.0.1',
                     user='root',
                     password='your_password',
                     db='soloDB',
                     charset='utf8')
                     
                     
cur = conn.cursor()
cur.execute("CREATE TABLE userTable (id char(4), userName char(15), email char(20), birthYear int)")

cur.execute("INSERT INTO userTable VALUES('Hong','홍지윤','hong@naver.com','1996')")
cur.execute("INSERT INTO userTable VALUES('Kim','김태연','kim@daum.net','2011')")
cur.execute("INSERT INTO userTable VALUES('Star','별사랑','star@paran.com','1990')")
cur.execute("INSERT INTO userTable VALUES('Yang','양지은','yang@gmail.com','1993')")      

conn.commit()
conn.close()

 

  • 위 결과를 다시 MySQL Workbench에서 확인해보면 다음과 같이 만들어진 것을 확인할 수 있다.
USE soloDB ;
SELECT * FROM userTable
출력 결과

(1) 데이터 입력

  • 일반 사용자가 간단하게 테이블에 값을 입력할 수 있도록, 다음과 같이 파이썬 코드로 한 번에 작성할 수 있다.
import pymysql


# 전역변수 선언부
conn, cur = None, None
data1, data2, data3, data4 = "", "", "", ""

# 메인 코드
conn = mysql.connect(host='127.0.0.1',
                     user='root',
                     password='your_password',
                     db='soloDB',
                     charset='utf8')

cur = conn.cursor()

while True:
    data1 = input('사용자 ID ==>')
    if data1 == "":
        break
    data2 = input('사용자 이름 ==>')
    data3 = input('사용자 이메일 ==>')
    data4 = input('사용자 출생연도 ==>')
    
    sql = f"INSERT INTO userTable VALUES('{data1}','{data2}','{data3}','{data4}')"
    cur.execute(sql)
    
conn.commit()
conn.close()


(2) 데이터 조회

  • 위처럼 파이썬으로 데이터를 다음과 같이 조회할 수도 있다.
    • print문에서 간격은 본인의 출력값에 맞게 조절하면 된다.
import pymysql


# 전역변수 선언부
conn, cur = None, None
data1, data2, data3, data4 = "", "", "", ""
row = None

# 메인 코드
conn = mysql.connect(host='127.0.0.1',
                     user='root',
                     password='your_password',
                     db='soloDB',
                     charset='utf8')

cur = conn.cursor()

cur.execute("SELECT * FROM userTable")

print(f'{"사용자 ID":<15}{"사용자 이름":<15}{"이메일":<25}{"출생연도":<5}')
print('-'*75)

while True:
    row = cur.fetchone() # 첫 번째 단일 행
    if row == None:
        break
    data1 = row[0] # 행의 첫 번째 값(=사용자 ID)
    data2 = row[1] # 행의 두 번째 값(=사용자 이름)
    data3 = row[2] # 행의 세 번째 값(=사용자 이메일)
    data4 = row[3] # 행의 네 번째 값(=사용자 출생연도)
    
    print(f'{data1:<18}{data2:<18}{data3:<27}{data4:<10}')
    

conn.close()
출력 결과

23강.

데이터 입력 & 조회할 수 있는 GUI 프로그램 만들기

  • 우선 GUI를 만들기 위한 라이브러리를 import한다.
import pymysql
from tkinter import *
from tkinter import messagebox

 

 

  • 앞서 데이터를 입력/조회하는 파이썬 코드를 다룬 것을 함수화 한다.
    • tkinter 라이브러리 형식에 맞게 수정한다. 
def insertData():
    conn, cur = None, None
    data1, data2, data3, data4 = "", "", "", ""
    sql = ""
    
    conn = mysql.connect(host='127.0.0.1',
                         user='root',
                         password='your_password',
                         db='soloDB',
                         charset='utf8')

    cur = conn.cursor()
    
    data1 = edt1.get() ; data2 = edt2.get() ; data3 = edt3.get() ; data4 = edt4.get()
    sql = f"INSERT INTO userTable VALUES('{data1}','{data2}','{data3}','{data4}')"
    cur.execute(sql)
    
    conn.commit()
    conn.close()
    
    messagebox.showinfo('Success', '데이터 입력 성공!')

-----------------------------------------------------------------------------------------
def selectData():
    strData1, strData2, strData3, strData4 = [], [], [], []
    
    conn = mysql.connect(host='127.0.0.1',
                         user='root',
                         password='your_password',
                         db='soloDB',
                         charset='utf8')

    cur = conn.cursor()
    cur.execute("SELECT * FROM userTable")
    
    strData1.append('사용자 ID') ; strData2.append('사용자 이름') ; strData3.append('사용자 이메일') ; strData4.append('사용자 출생연도')
    strData1.append('-'*15) ; strData2.append('-'*15) ; strData3.append('-'*25) ; strData4.append('-'*20)
    
    while True:
        row = cur.fetchone()
        if row == None:
            break
        strData1.append(row[0]) ; strData2.append(row[1]) ; strData3.append(row[2]) ; strData4.append(row[3])
        
    listData1.delete(0,listData1.size() - 1) ; listData2.delete(0,listData2.size() - 1) ; listData3.delete(0,listData3.size() - 1) ; listData4.delete(0,listData4.size() - 1)
    
    for item1, item2, item3, item4 in zip(strData1, strData2, strData3, strData4):
        listData1.insert(END, item1) ; listData2.insert(END, item2) ; listData3.insert(END, item3) ; listData4.insert(END, item4)
        
    conn.close()

 

 

  • 위 함수들을 이용해서 해당 값들을 반환하는 GUI를 디자인한다.
####### root 설정 #######
root = Tk()
root.geometry("700x300")
root.title('GUI 프로그램')


####### Frame 설정 #######
edtFrame = Frame(root)
edtFrame.pack(padx=10, pady=10)
listFrame = Frame(root)
listFrame.pack(side=BOTTOM, fill=BOTH, expand=1)


####### Label + Entry 위아래 정렬 #######
label1 = Label(edtFrame, text="ID").grid(row=0, column=0, padx=5, pady=5)
edt1 = Entry(edtFrame, width=15)
edt1.grid(row=1, column=0, padx=5, pady=5)

label2 = Label(edtFrame, text="이름").grid(row=0, column=1, padx=5, pady=5)
edt2 = Entry(edtFrame, width=15)
edt2.grid(row=1, column=1, padx=5, pady=5)

lable3 = Label(edtFrame, text="이메일").grid(row=0, column=2, padx=5, pady=5)
edt3 = Entry(edtFrame, width=25)
edt3.grid(row=1, column=2, padx=5, pady=5)

label4 = Label(edtFrame, text="출생연도").grid(row=0, column=3, padx=5, pady=5)
edt4 = Entry(edtFrame, width=15)
edt4.grid(row=1, column=3, padx=5, pady=5)


####### 입력/조회 버튼 #######
btnInsert = Button(edtFrame, text='입력', command=insertData) 
btnInsert.grid(row=1,column=4,padx=5,pady=5)
btnSelect = Button(edtFrame, text='조회', command=selectData)
btnSelect.grid(row=1,column=5,padx=5,pady=5)


####### 테이블 값 #######
listData1 = Listbox(listFrame, bg='White')
listData1.pack(side=LEFT, fill=BOTH, expand=1)
listData2 = Listbox(listFrame, bg='White')
listData2.pack(side=LEFT, fill=BOTH, expand=1)
listData3 = Listbox(listFrame, bg='White')
listData3.pack(side=LEFT, fill=BOTH, expand=1)
listData4 = Listbox(listFrame, bg='White')
listData4.pack(side=LEFT, fill=BOTH, expand=1)

root.mainloop()

  • 위 코드를 실행하면 아래와 같이 출력되고, 입력/조회 모두 정상 작동하는 것을 확인할 수 있다.
출력 결과
초기 조회
입력
입력 결과
입력 후 조회

'Study' 카테고리의 다른 글

[SQL] Chapter 7. (18~20강)  (0) 2025.07.08
[SQL] Chapter 6. (15~17강)  (0) 2025.07.07
[SQL] Chapter 5. (12~14강)  (0) 2025.07.07
[SQL] Chapter 4. (9~11강)  (0) 2025.07.07
[SQL] Chapter 3. (6~8강)  (0) 2025.07.07