스터디/SQL

[SQL] 8. SQL과 파이썬 연결

2024. 5. 6. 02:40

*해당 내용은 우재남 저자님의 <혼자 공부하는 SQL>을 보고 정리한 내용입니다.

 

파이썬 소개

  • 무료로 강력한 기능을 사용할 수 있다.
  • 설치와 사용 환경 구축이 쉽다.
  • 다양하고 강력한 외부 라이브러리들이 많다.

파이썬을 MySQL과 연결해주는 대표적인 외부 라이브러리인 PyMySQL을 사용할 것이다.

 

파이썬과 pymysql 설치를 완료해주었다. (과정은 생략)


연동 프로그래밍 기본

연동 프로그램을 위한 쇼핑몰 생성

DROP DATABASE IF EXISTS soloDB;
CREATE DATABASE soloDB;

 

파이썬에서 데이터 입력

 

아래와 같이 데이터베이스를 구축했다.

import pymysql

conn = pymysql.connect(host='127.0.0.1', user='root', password='0000', 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( 'yand', '양지은', 'yang@gmail.com', 1993)")

conn.commit()
conn.close()

 

연동 프로그래밍 활용

완전한 데이터 입력 프로그램의 완성

아래는 사용자가 반복해서 데이터를 입력하는 코드이다. 더 이상 입력할 데이터가 없으면 엔터키를 입력하여 종료된다.

import pymysql

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

# 메인 코드
conn = pymysql.connect(host='127.0.0.1', user='root', password='0000', db='soloDB', charset='utf8')
cur = conn.cursor()

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

conn.commit()
conn.close()

 

MySQL의 데이터 조회를 위한 파이썬 코딩 순서

 

완전한 데이터 조회 프로그램의 완성

import pymysql

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

# 메인 코드
conn = pymysql.connect(host='127.0.0.1', user='root', password='0000', db='soloDB', charset='utf8')
cur = conn.cursor()

cur.execute("SELECT * FROM userTable")

print("사용자ID    사용자이름    이메일        출생연도")
print("----------------------------------------------------")

while (True) :
    row = cur.fetchone()
    if row== None :
        break
    data1 = row[0]
    data2 = row[1]
    data3 = row[2]
    data4 = row[3]
    print("%5s   %15s   %20s   %d" % (data1, data2, data3, data4))

conn.close()

 

정리

  • 데이터베이스 연동은 SQL을 파이썬과 연결하는 것을 말한다.
  • import pymysql 명령을 사용해서 SQL과 파이썬을 연동한다.
  • MySQL과 파이썬의 연결을 위해서는 pymysql.connect()로 연결자를 생성하고, 연결 통로인 커서를 통해 파이썬에서 MySQL로 SQL을 전송한다.
  • 데이터를 변경한 후에는 커밋을 수행해야 변경된 내용이 확정된다.
  • 파이썬에서 SELECT 문으로 데이터를 조회한 후에는 fetchone() 함수를 통해서 데이터를 한 행씩 가져온다.

GUI 기본 프로그래밍

GUI는 윈도에 그래픽 환경을 제공되는 화면을 통틀어서 말한다. 파이썬을 통해 윈도에 출력되는 GUI 응용 프로그램을 작성할 수 있다. 이를 도와주는 것이 tkinter라는 라이브러리이다.

 

기본 윈도의 구성

GUI의 가장 기본적인 윈도 화면의 구성이다.

from tkinter import *

root = Tk()

# 이 부분에서 화면을 구성하고 처리합니다

root.mainloop()

 

윈도에 제목을 지정하고, 크기를 설정할 수 있다.

from tkinter import *

root = Tk()
root.title("혼공 GUI 연습")
root.geometry("400x200")

root.mainloop()

 

라벨

라벨은 문자를 표현할 수 있는 위젯으로, label 형식을 사용한다.

위젯은 윈도에 나오는 버튼, 텍스트, 라디오 버튼, 이미지 등을 통합해서 지칭하는 용어이다. 옵션에서 모양에 대한 다양한 설정을 할 수 있고 모든 위젯들은 pack() 함수를 사용해야 화면에 나타난다.

from tkinter import *
root = Tk()
root.geometry("300x100")

label1 = Label(root, text="혼공 SQL은")
label2 = Label(root, text="쉽습니다.", font=("궁서체", 30), bg="blue", fg="yellow")

label1.pack()
label2.pack()

root.mainloop()

실행 결과

 

버튼

버튼은 마우스를 클릭하면 지정한 작업이 실행되도록 사용하는 위젯으로 Button 형식을 사용한다. command 옵션으로 사용자가 버튼을 눌렀을 때 지정한 작업을 처리한다.

from tkinter import *
from tkinter import messagebox

def clickButton() :
    messagebox.showinfo('버튼 클릭', '버튼을 눌렀습니다..')

root = Tk()
root.geometry("200x200")

button1 = Button(root, text="여기를 클릭하세요", fg="red", bg="yellow", command=clickButton)
button1.pack(expand = 1)

root.mainloop()

실행 결과

 

위젯의 정렬

pack() 함수의 옵션 중에서 가로로 정렬하는 방법으로 side=LEFT 또는 RIGHT 방식이 있다.

from tkinter import *
root = Tk()

button1 = Button(root, text="혼공1")
button2 = Button(root, text="혼공2")
button3 = Button(root, text="혼공3")

button1.pack(side=RIGHT)
button2.pack(side=RIGHT)
button3.pack(side=RIGHT)

root.mainloop()

실행 결과

 

위젯 사이에 여백 추가

위젯 사이에 여백을 주려면 pack() 함수의 옵션 중 padx=픽셀값 또는 pady=픽셀값 방식을 사용한다.

from tkinter import *
root = Tk()

button1 = Button(root, text="혼공1")
button2 = Button(root, text="혼공2")
button3 = Button(root, text="혼공3")

button1.pack(side=TOP, fill=X, padx=10, pady=10)
button2.pack(side=TOP, fill=X, padx=10, pady=10)
button3.pack(side=TOP, fill=X, padx=10, pady=10)

root.mainloop()

실행 결과

 

프레임, 엔트리, 리스트 박스

프레임은 화면을 여러 구역으로 나눌 때 사용한다. 엔트리는 입력 상자를 표현하고, 리스트 박스는 목록을 표현한다.

from tkinter import *
root = Tk()
root.geometry("200x250")

upFrame = Frame(root)
upFrame.pack()
downFrame = Frame(root)
downFrame.pack()

editBox = Entry(upFrame, width = 10)
editBox.pack(padx = 20, pady = 20)

listbox = Listbox(downFrame, bg = 'yellow');
listbox.pack()

listbox.insert(END, "하나")
listbox.insert(END, "둘")
listbox.insert(END, "셋")

root.mainloop()

실행 결과

 

완전한 형태의 GUI 응용 프로그래밍

import pymysql
from tkinter import *
from tkinter import messagebox

## 메인 코드부
def insertData() :
    con, cur = None, None
    data1, data2, data3, data4 = "", "", "", ""
    sql=""

    conn = pymysql.connect(host='127.0.0.1', user='root', password='0000', db='soloDB', charset='utf8')
    cur = conn.cursor()

    data1 = edt1.get();    data2 = edt2.get();    data3 = edt3.get();    data4 = edt4.get()
    sql = "INSERT INTO userTable VALUES('" + data1 + "','" + data2 + "','" + data3 + "'," + data4 + ")"
    cur.execute(sql)

    conn.commit()
    conn.close()

    messagebox.showinfo('성공', '데이터 입력 성공')


def selectData() :
    strData1, strData2, strData3, strData4  = [], [], [], []

    conn = pymysql.connect(host='127.0.0.1', user='root', password='0000', db='soloDB', charset='utf8')
    cur = conn.cursor()
    cur.execute("SELECT * FROM userTable")
    
    strData1.append("사용자 ID");      strData2.append("사용자 이름")
    strData3.append("사용자 이메일");   strData4.append("사용자 출생연도")
    strData1.append("-----------");    strData2.append("-----------")
    strData3.append("-----------");    strData4.append("-----------")
    
    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()    


## 메인 코드부
root = Tk()
root.geometry("600x300")
root.title("완전한 GUI 응용 프로그램")

edtFrame = Frame(root);
edtFrame.pack()
listFrame = Frame(root)
listFrame.pack(side = BOTTOM,fill=BOTH, expand=1)

edt1= Entry(edtFrame, width=10);    edt1.pack(side=LEFT,padx=10,pady=10)
edt2= Entry(edtFrame, width=10);    edt2.pack(side=LEFT,padx=10,pady=10)
edt3= Entry(edtFrame, width=10);    edt3.pack(side=LEFT,padx=10,pady=10)
edt4= Entry(edtFrame, width=10);    edt4.pack(side=LEFT,padx=10,pady=10)

btnInsert = Button(edtFrame, text="입력", command = insertData)
btnInsert.pack(side=LEFT,padx=10,pady=10)
btnSelect = Button(edtFrame, text="조회", command =selectData )
btnSelect.pack(side=LEFT,padx=10,pady=10)

listData1 = Listbox(listFrame,bg = 'yellow');
listData1.pack(side=LEFT,fill=BOTH, expand=1)
listData2 = Listbox(listFrame,bg = 'yellow')
listData2.pack(side=LEFT,fill=BOTH, expand=1)
listData3 = Listbox(listFrame,bg = 'yellow')
listData3.pack(side=LEFT,fill=BOTH, expand=1)
listData4 = Listbox(listFrame,bg = 'yellow')
listData4.pack(side=LEFT,fill=BOTH, expand=1)

root.mainloop()

'스터디 > SQL' 카테고리의 다른 글

[SQL] 7. 스토어드 프로시저  (0) 2024.05.06
[SQL] 6. 인덱스  (0) 2024.04.29
[SQL] 5. 테이블과 뷰  (0) 2024.03.29
[SQL] 4. SQL 고급 문법  (0) 2024.03.25
[SQL] 3. SQL 기본 문법  (2) 2024.03.18