Python

[Python] PyMySQL - MySQL SELECT 하기

비번변경 2022. 11. 5. 23:10

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

https://backtony.github.io/mysql/2021-01-20-mysql-26/