PyMySQL
Python을 이용해 MySQL을 다룰 때 사용할 수 있는 라이브러리 중 하나로, 순수하게 python으로 구현되어 있다.
💡 다른 라이브러리
- mysql-connector-python : Oracle에서 공식적으로 지원하는 라이브러리. mysql 8.0 이상의 버전에서 사용할 수 있다.
- mysqlclient : PyMySQL을 개발한 측에서 개발한 라이브러리. C로 구현되어 있다.
이 글에서는 MySQL을 다룰 때 사용할 수 있는 라이브러리 중 대중적으로 사용되는 PyMySQL을 이용해 데이터를 SELECT 하는 방법을 정리한다.
설치
PyMySQL 라이브러리는 아래 명령어로 설치할 수 있다.
pip install PyMySQL
import
설치한 PyMySQL 라이브러리는 아래와 같이 import하여 사용한다.
import pymysql
SELECT를 위한 프로그래밍 순서
PyMySQL을 사용하여 MySQL을 다룰 때는 보통 연결 -> 커서 생성 -> SQL 실행 -> 연결 종료의 순으로 프로그래밍한다. 특히 SELECT 할 때는 아래 흐름도와 같은 순서로 프로그래밍한다.
💡 INSERT / UPDATE / DELETE 시
기본적으로 autocommit이 활성화되어 있지 않으므로, 변경한 데이터는 commit까지 완료해야 MySQL에 반영된다.
commit은 conn.commit() 함수를 사용하여 할 수 있다.
흐름도대로 코드를 정리해본다.
1. MySQL 연결
connect 함수에 연결할 DB 접속 정보를 전달하여 MySQL과 연결할 수 있다. 접속 정보는 DB 서버 주소와 포트 번호, 연결할 사용자 이름과 비밀번호, DB 이름과 인코딩 정보가 있다.
import pymysql
conn = pymysql.connect(host='DB_SERVER_IP', port='PORT'
user='USERNAME', password='PASSWORD',
db='DATABASE_NAME', charset='CHARSET')
2. Cursor 생성
연결한 MySQL과 상호작용하기 위한 객체인 Cursor를 생성한다. 생성한 커서를 이용해 SQL을 실행하거나 실행한 결과를 반환받을 수 있다.
Cursor의 종류는 여러가지가 존재하는데, 기본 커서는 데이터를 Tuple 형태로 받는다. 만약 Dictionary 형태로 반환받고 싶다면 DictCursor을 생성하여 사용할 수 있다.
# Tuple
cur = conn.cursor()
# DictCursor
cur = conn.cursor(pymysql.cursors.DictCursor)
3. 데이터 조회 (SQL 실행)
execute 함수를 사용하여 SQL을 실행한다.
sql = f"""
SELECT COUNT(1) AS COUNT
FROM test_table
"""
cur.execute(sql)
형식 지정자와 튜플을 이용하면 동적 SQL도 사용할 수 있다.
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
cur.execute(sql, ('webmaster@python.org', 'very-secret'))
4. 조회한 데이터 출력
execute로 실행한 결과는 fetch 계열의 함수로 접근할 수 있다.
메서드 | 설명 |
fetchall() | 모든 데이터를 한 번에 가져올 때 사용 |
fetchone() | 한 번 호출에 하나의 행만 가져올 때 사용 |
fetchmany(n) | n개만큼의 데이터를 가져올 때 사용 |
data = cur.fetchall()
5. 연결 종료
MySQL 작업을 끝냈다면 close 함수를 연결을 종료한다.
conn.close()
SELECT를 위한 프로그램
위에서 살펴본 코드 전체는 다음과 같다.
import pymysql
# MySQL 연결
conn = pymysql.connect(host='localhost', port=3310,
user='app_user', password='passwd',
db='db_name', charset='utf8')
# Cursor 생성
cur = conn.cursor(pymysql.cursors.DictCursor)
# SQL 실행
sql = f"""
SELECT COUNT(1) AS COUNT
FROM test_table
"""
cur.execute(sql)
# 데이터 접근
result = cur.fetchall()
# 연결 종료
conn.close()
print(result)
실행 결과
[{'COUNT': 0}]
또는 with문을 사용할 수도 있다. with문을 사용하면 connection close를 신경 쓰지 않아도 된다.
import pymysql
# MySQL 연결
conn = pymysql.connect(host='localhost', port=3310,
user='app_user', password='passwd',
db='db_name',
charset='utf8', cursorclass=pymysql.cursors.DictCursor)
with conn:
# Cursor 생성
with conn.cursor() as cur:
# SQL 실행
sql = f"""
SELECT COUNT(1) AS COUNT
FROM test_table
"""
cur.execute(sql)
# 데이터 접근
result = cur.fetchall()
print(result)
참고 문서
https://github.com/PyMySQL/PyMySQL
https://pymysql.readthedocs.io/en/latest/
https://yurimkoo.github.io/python/2019/09/14/connect-db-with-python.html
https://hongong.hanbit.co.kr/파이썬과-mysql-데이터베이스-연동하기-pymysql-라이브러리-설/
http://bigdata.dongguk.ac.kr/lectures/DB/_book/python에서-mysql데이터의-접근.html