본문 바로가기
SQL

파이썬과 Pymysql 연동 방법

by Antonio Bae 2023. 8. 23.

안녕하세요 오늘은 pymysql 연동방법을 알려드리겠습니다.

로컬환경이나 서버 둘다 상관 없습니다.

 

목차

1.MySQL 연결

2.커서 생성

3.테이블 만들기

4.데이터 입력

5.입력한 데이터 저장

6.MySQL 연결 종료

 

1.MySQL 연결

먼저 리눅스나 myworkbench에서 soloDB 생성

 

사진 설명을 입력하세요.

다음으로 vscode 나 리눅스환경에서 파이썬 파일을 만듭니다.

 

2.커서 생성

import pymysql


#main code
conn = pymysql.connect(host='127.0.0.1', user='root', password='ZZ66&!!', db='soloDB', charset='utf8')
cur = conn.cursor()
 

 

3.테이블 만들기

사진 설명을 입력하세요.

4.데이터 입력

cur.execute("INSERT INTO userTable VALUES('a', '뷔', 'hong@naver.com', 1996)")
cur.execute("INSERT INTO userTable VALUES('b', '지연', 'hong@naver.com', 1996)")
cur.execute("INSERT INTO userTable VALUES('c', '알윤', 'hong@aver.com', 1996)")
cur.execute("INSERT INTO userTable VALUES('d', '홍지윤', 'hong@naver.com', 1996)")
cur.execute("INSERT INTO userTable VALUES('e', '행복', 'hong@naver.com', 1996)")
 

5.입력한 데이터 저장

conn.commit()
 

6.MySQL 연결 종료

conn.close()
 

 

GUI 응용프로그램를 활용하는 방법

파이썬은 윈도 화면을 제공합니다.

 

tkinter을 사용하면 창을 띄우고 창을 꾸밀 수 있습니다.

라벨, 체크박스, 라디오 위젯 등을 만들 수 있습니다.

https://ko.linux-console.net/?p=10318#gsc.tab=0

 

tkinter설치

import tkinter

root = tkinter.Tk()

root.mainloop()
 

 

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

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

label1.pack()
label2.pack()

root.mainloop()
 

 

import pymysql
conn, cur = None, None
data1, data2, data3, data4 = "", "", "", ""
sql=""

#main code
conn = pymysql.connect(host='127.0.0.1', user='c18st10', password='6f60860nnayoeFzU', db='c18st10', 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()    
 

 

import pymysql
conn, cur = None, None
data1, data2, data3, data4 = "", "", "", ""
row = None

#main code
conn = pymysql.connect(host='127.0.0.1', user='c18st10', password='6f60860nnayoeFzU', db='c18st10', 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()
 

 

import pymysql
conn, cur = None, None
data1, data2, data3, data4 = "", "", "", ""
row = None

#main code
conn = pymysql.connect(host='127.0.0.1', user='c18st10', password='6f60860nnayoeFzU', db='c18st10', 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()
 

8-7

사진 설명을 입력하세요.

 

8-8

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()
 

8-9

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

upFrame = Frame(root)
upFrame.pack()
downFrame = Frame(root)
upFrame.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()
 

8-10

#402
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='antonio77!!A', 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='antonio77!!A', 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.delete(0,listData1.size() -1)
        strData2.delete(0,listData2.size() -1)
        strData3.delete(0,listData3.size() -1)
        strData4.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)
btnInsert = Button(edtFrame, text="조회", command = selectData)
btnInsert.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()
 
 

 

 

만약 다음과 같이 에러가 발생한다면 mysql_native_password 로 접근할 수 있도록 처리해야 합니다.

사진 설명을 입력하세요.

해결하기 위해서는 터미널에서 mysql에 접속 후, 다음과 같이 비밀번호를 변경해줍니다.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '변경할-비밀번호';
mysql> FLUSH PRIVILEGES;