✨ 이번 챕터를 수행하기 위해서는 파이썬을 미리 설치해두어야 한다!
📒 요약 : 파이썬으로 데이터베이스와 연결하면 데이터를 입력, 수정, 조회하는 등 SQL의 활용도를 높일 수 있다. 이번 챕터에서는 MySQL 과 파이썬을 연동해보자.
파이썬과 pymysql 라이브러리를 설치한 후에는 MySQL과 연동하는 데이터베이스 연동 프로그램을 작성할 수 있다. 파이썬 프로그램을 작성하는 가장 큰 이유는 일반 사용자가 데이터베이스의 내용을 사용하고자 할 때 SQL까지 배우기에는 무리가 있기 때문인데, 파이썬을 잘 이용한다면 일반 사용자는 SQL 대신 파이썬의 간단한 명령어를 입력하는 것만으로도 데이터베이스에서 원하는 결과를 얻을 수 있다.
파이썬과 MySQL 데이터베이스를 연동해보자. 연동 프로그램이 완성되면 MySQL 워크벤치가 없어도 MySQL에 접근하고 사용할 수 있다.
우리는 아래의 모습과 같은 '혼공 쇼핑몰 DB(soloDB)'를 만들 것이다.
아이디 | 회원 이름 | 이메일 | 출생연도 |
hong | 홍지윤 | hong@naver.com | 1996 |
kim | 김태연 | kim@daum.net | 2011 |
star | 뱔시링 | star@paran.com | 1990 |
yang | 양지은 | yang@gmail.com | 1993 |
DROP DATABASE IF EXISTS soloDB;
CREATE DATABASE soloDB;
파이썬에서 데이터를 입력하기 위해서는 아래와 같은 단꼐를 거친다는 것을 확인하고 넘어가자. 우리도 해당 과정을 거쳐서 데이터를 입력할 것이다.
- MySQL 연결하기 : 연결자 = pymysql.connect()
- 커서 생성하기 : 커서이름 = 연결자.cursor()
- 테이블 만들기 : 커서이름.execute("CREATE TABLE문장")
- 데이터 입력하기(반복) : 커서이름.execute("INSERT문장")
- 입력한 데이터 저장하기 : 연결자.commit()
- MySQL 연결 종료하기 : 연결자.close()
IDLE 창을 실행해서 대화형 모드로 진행해보자.
먼저 pymysql 모듈을 임포트하고 pymysql.Connect()로 데이터베이스를 연동한다. 아래의 코드를 실행하여 연결이 성공해도 아무런 메시지도 나오지 않는다.
import pymysql
# MySQL 데이터베이스와 연결
conn = pymysql.connect(host='127.0.0.1', user='root', password='0000', db='soloDB', charset='utf8')
커서는 데이터베이스에 SQL문을 실행하거나 실행된 결과를 돌려받는 통로로 생각하면 된다. 1번에서 연결한 연결자에 커서를 만들자.
# 커서 생성하기
cur = conn.cursor()
이번에는 테이블을 만들 차례이다. 테이블을 만드는 SQL문을 커서이름.execute() 함수의 매개변수로 넘기면 SQL문이 데이터베이스에 실행된다. 즉, 파이썬에서도 MySQL 워크벤치에서 사용한 것과 같은 SQL문을 사용하면 된다.
# 테이블 생성하기
cur.execute("CREATE TABLE userTable(id char(4), userName char(15), email char(20), birthYear int")
이제 조금 전에 만든 테이블에 앞서 구상한 데이터를 입력하자. 데이터 입력도 SQL문을 사용해야 하므로 커서이름.execute() 함수를 활용한다. 아래의 코드를 입력하고 실행하면 결과의 번호가 1이 나오는데, 1건이 입력되었다는 의미이다.
# 테이블 생성하기
cur.execute("INSER INTO userTable VALUES('hong', '홍지윤', 'hong@naver.com', 1996)")
cur.execute("INSER INTO userTable VALUES('kim', '김태연', 'kim@daum.net', 2011)")
cur.execute("INSER INTO userTable VALUES('star', '별사랑', 'star@paran.com', 1990)")
cur.execute("INSER INTO userTable VALUES('yang', '양지은', 'yang@gmail.com', 1993)")
앞에서 입력한 4건의 데이터는 아직 데이터베이스에 완전히 저장된 것은 아니다. 임시로 저장된 상태로, 이를 확실하게 저장하기 위해서는 commit해야 한다. 이렇게 데이터베이스를 저장하고 용건이 끝났다면 연결한 데이터베이스를 닫늗다.
# 커밋하기
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문을 빠져나간다.
while (True) :
data1 = input("사용자 ID ==> ")
if data1 == "" :
break;
data2 = input("사용자 이름 ==> ")
data3 = input("사용자 이메일 ==> ")
data4 = input("사용자 출생연도 ==> ")
# INSERT문으로 입력한 데이터를 sql 변수에 문자열로 만든다.
sql = "INSERT INTO userTable VALUES('" + data1 + "','" + data2 + "','" + data3 + "'," + data4 + ")"
# sql 변수로 저장한 SQL문을 실행한다.
cur.execute(sql)
conn.commit()
conn.close()
파이썬으로 데이터를 조회하기 위해서는 아래와 같은 단계를 거친다. 데이터를 입력할 대와 비슷하지만, 몇 가지 다른 부분이 있다. 3, 4번 과정이 다른데, 3번에서는 커서에 SELECT로 조회한 결과를 한꺼번에 저장해 둔다. 그리고 4번에서 조회한 데이터를 fetchone() 함수로 한 행씩 접근한 후 출력한다. 또한 데이터를 조회할 때는 테이블에 변동이 생기는 것이 아니므로 커밋할 필요가 없다.
- MySQL 연결하기
- 커서 생성하기
- 데이터 조회하기 : 커서이름.executE("SELECT 문장")
- 조회한 데이터 출력하기 : 커서이름.fetchone()
- 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()
#SELECT 문으로 테이블을 조회한다. 조회한 결과는 cur 변수에 저장된다.
cur.execute("SELECT * FROM userTable")
print("사용자ID 사용자이름 이메일 출생연도")
print("----------------------------------------------------")
while (True) :
#fetchone()함수로 결과를 한 행씩 추출한다.
row = cur.fetchone()
if row== None :
break
data1 = row[0]
data2 = row[1]
data3 = row[2]
data4 = row[3]
#fetchone()함수로 조회된 결과가 저장된 row 변수에는 튜플 형식으로 각 행의 데이터가 저장된다. 해당 튜플을 형식에 맞춰 한 줄에 출력한다.
print("%5s %15s %20s %d" % (data1, data2, data3, data4))
conn.close()