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()
- 위 코드를 실행하면 아래와 같이 출력되고, 입력/조회 모두 정상 작동하는 것을 확인할 수 있다.
| 출력 결과 |
|
| 초기 조회 |
|
| 입력 |
|
| 입력 결과 |
|
| 입력 후 조회 |
|