[혼공 SQL] 6주차 (2) - CH 08 SQL과 파이썬 연결

cup-wan·2024년 2월 14일
0

1) 파이썬과 MySQL의 연동

연동 프로그래밍 기본

각자의 개발 환경에 맞춰 파이썬 준비

python 3.8.18 // pycharm // anaconda 가상서버 // pymysql 사용

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

MySQL 워크벤치에서 soloDB 생성
이후로는 파이썬만 사용하기에 워크벤치는 더 이상 사용하지 않는다.


연동 프로그래밍 활용

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

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

# 메인 코드
conn = pymysql.connect(host='127.0.0.1', user='root', password='', 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()

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

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

# 메인 코드
conn = pymysql.connect(host = '127.0.0.1', user = 'root', password='', 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 %8s %20s %8d"%(data1, data2, data3, data4))

conn.close()

2) GUI 응용 프로그램

GUI 기본 프로그래밍

기본 윈도의 구성

tkinter 라이브러리를 사용해 파이썬으로 GUI 만들기

from tkinter import *

root = Tk()

# 이 부분이 화면을 구성하는 코드

root.mainloop()

라벨

라벨은 문자를 표현할 수 있는 위젯. label(부모윈도, 옵션 ...)

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(부모윈도, 옵션...)

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사용해 정렬
  • pack() 함수 옵션 중에 padx=픽셀값, pady=픽셀값 사용해 여백 추가 가능

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

  • frame = 화면 구역 나누기
  • entry = 입력 상자 표현
  • listbox = 목록 표현

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

MySQL을 연동해 데이터를 입력, 조회 가능한 GUI 만들기

import pymysql
from tkinter import *
from tkinter import messagebox

## INSERT function
def insertData():
    conn, cur = None, None
    data1, data2, data3, data4 = "","","",""
    sql = ""
    
    conn = pymysql.connect(host = '127.0.0.1', user = 'root',
                          password = '', 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('성공', '데이터 입력 성공')
    
## SELECT function
def selectData():
    strData1, strData2, strData3, strData4 = [], [], [], []
    
    conn = pymysql.connect(host = '127.0.0.1', user = 'root', password = '', 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()

## GUI use tkinter
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()

(1045, "Access denied for user 'root'@'localhost' (using password: NO)")

  • ㅎㅎ 연동 계속 실패
  • 구글링 결과 비밀번호 초기화 or 변경하래서 변경 선택
  • https://99cone.tistory.com/19 이 글을 참고해 그냥 쿼리로 작성 후 비밀번호 변경
  • 그래도 접속이 안되길래 워크벤치 재접속

?????????????????????????????나에게 왜 이런 시련을?????
https://bugs.mysql.com/bug.php?id=100406 공홈 리포트 찾아보니 나와 비슷한 이유로 이 버그를 직면한 사람이 많았다.

그들이 하라는 걸 다 해봤지만 실패했다는 소리

다시 한 번 확인 후 글 수정 예정


3) 미션

눈물 흘리고 있는 사람? = 나

profile
아무것도 안해서 유죄 판결 받음

0개의 댓글