PyMySQL - 파이썬으로 MySQL 사용하기

    Python으로 MySQL에 접속하고, 데이터를 다루려면 여러 라이브러리가 있다. 마침 StackOverFlow에도 이와 관련한 Q&A가 있어서 살펴보고 선택하고자 한다.

    https://stackoverflow.com/questions/43102442/whats-the-difference-between-mysqldb-mysqlclient-and-mysql-connector-python

     

    What's the difference between MySQLdb, mysqlclient and MySQL connector/Python?

    So I've been trying to do some database update with python and while setting up the whole dev environment, I came across these three things which made me dizzy. There's MySQLdb There's mysqlclient...

    stackoverflow.com

    • 성능이 중요한 것이 아니라면, PyMySQL을 선택하자. 웬만하면 mysql-connector-python은 사용하지 말자는 이야기 되겠다.

     

    python 가상환경 설정/ 변경

    설치/ 테스트를 위해, 가상 개발환경을 확인하고 변경한다.

    $ pyenv versions
      system
      2.7.16
      2.7.16/envs/venv-2.7.16
      3.7.2
      3.7.2/envs/test
      3.7.2/envs/venv-3.7.2
      3.7.3
      3.8.5
      test
      venv-2.7.16

    사전에 위와 같이 설정을 해두었고, 이중 venv-3.7.2를 테스트 환경으로 사용해 보고자 한다.

     $ mkdir pymysql_test
     $ cd pymysql_test
     $ pyenv local venv-3.7.2

    해당 디렉토리에서 venv-3.7.2를 사용한다고 설정한다.

     

    PyMySQL 설치

    만약 설치가 되어 있다면, 파이썬을 실행한 후에

    import pymysql

    문이 정상적으로 실행될 것이다. 따라서, PyMySQL을 설치하기에 앞서, 다음과 같이 확인해보자.

    $ python -c 'import pymysql'
    
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    ModuleNotFoundError: No module named 'pymysql'

    위와 같이 에러가 발생한다면, 라이브러리가 설치되어 있지 않은 것이다.

    $ pip install PyMySQL
    
    Collecting PyMySQL
      Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)
         |████████████████████████████████| 43 kB 461 kB/s
    Installing collected packages: PyMySQL
    Successfully installed PyMySQL-1.0.2

    위와 같이 설치가 완료되면, 정상적으로 설치되었는지 앞서 실행한 명령어로 다시 검사해 본다.

    python -c 'import pymysql'

    정상적으로 import가 된다면 별다른 에러 메시지가 뜨지 않는다.

     

    PyMySQL로 MySQL 접속하기

    import pymysql
    
    db = pymysql.Connect(host='localhost', user='*1', password='*2', database='*3')
    • *1에는 DB 계정을
    • *2에는 계정 비밀번호를
    • *3에는 접속하고자 하는 DB명을
      기록한다.

     

    테스트용 스키마 및 샘플

    테스트에 사용하는 스키마 및 샘플은 아래와 같다.

    CREATE TABLE IF NOT EXISTS `students` (
        id int(6) AUTO_INCREMENT,
        name varchar(255) NOT NULL,
        major varchar(255) NOT NULL,
        PRIMARY KEY (id)
    );
    
    
    INSERT INTO students (name, major) VALUES
        ('John', 'Music'),
        ('Sarah', 'Art'),
        ('Steve', 'Computer Science');

     

    PyMySQL로 CRUD 테스트하기

    SELECT

    먼저 기존에 입력되어 있는 데이터를 확인해 본다.

    import pymysql
    
    db = pymysql.Connect(host='localhost', user='*1', password='*2', database='*3')
    cursor = db.cursor()
    
    query = "SELECT * FROM students"
    cursor.execute(query)
    result = cursor.fetchall()
    
    print(result)

    를 실행하면 다음과 같은 결과를 확인할 수 있다.

    ((1, 'John', 'Music'), (2, 'Sarah', 'Art'), (3, 'Steve', 'Computer Science'))

    print(result) 부분을 다음과 같이 고치면,

    for x in result:
        print(x)

    아래와 같이 구분해서 확인 가능할 것이다.

    (1, 'John', 'Music')
    (2, 'Sarah', 'Art')
    (3, 'Steve', 'Computer Science')

    만약, 전체 결과를 확인하는 대신 한 개만 확인하려면,

    import pymysql
    
    db = pymysql.Connect(host='localhost', user='*1', password='*2', database='*3')
    cursor = db.cursor()
    
    query = "SELECT * FROM students"
    cursor.execute(query)
    result = cursor.fetchone()
    print(result)

    와 같이 실행하고, 다음과 같은 결과를 확인할 수 있다.

    (1, 'John', 'Music')

     

    INSERT

    import pymysql
    
    db = pymysql.Connect(host='localhost', user='*1', password='*2', database='*3')
    cursor = db.cursor()
    
    query = "INSERT INTO students (name, major) VALUES (%s, %s)"
    data = ('Emma', 'Movie')
    cursor.execute(query, data)
    
    db.commit()

    와 같이 실행하고, 앞서 실행한 SELECT 문으로 데이터가 정상적으로 추가되었는지 확인한다.

    (1, 'John', 'Music')
    (2, 'Sarah', 'Art')
    (3, 'Steve', 'Computer Science')
    (4, 'Emma', 'Movie')

    맨 마지막 레코드가 새로 추가된 것을 확인할 수 있다. execute()문 대신, executemany()를 사용하면 여러 데이터를 동시에 insert할 수도 있다.

    import pymysql
    
    db = pymysql.Connect(host='localhost', user='*1', password='*2', database='*3')
    cursor = db.cursor()
    
    query = "INSERT INTO students (name, major) VALUES (%s, %s)"
    data = [('Tom', 'Math'), ('Max', 'Statistics')]
    cursor.executemany(query, data)
    
    db.commit()

    다시 SELECT 문으로 데이터를 확인해 보면,

    (1, 'John', 'Music')
    (2, 'Sarah', 'Art')
    (3, 'Steve', 'Computer Science')
    (4, 'Emma', 'Movie')
    (5, 'Tom', 'Math')
    (6, 'Max', 'Statistics')

    데이터가 정상적으로 추가된 것을 확인할 수 있다.

     

    UPDATE

    특정 데이터를 변경해 보자.

    import pymysql
    
    db = pymysql.Connect(host='localhost', user='*1', password='*2', database='*3')
    cursor = db.cursor()
    
    
    query = "UPDATE students SET name = 'Ben' WHERE id = 6"
    cursor.execute(query)
    db.commit()

    앞서 마지막으로 입력한 데이터의 이름을 변경하였다. SELECT로 데이터를 확인해 보니,

    (1, 'John', 'Music')
    (2, 'Sarah', 'Art')
    (3, 'Steve', 'Computer Science')
    (4, 'Emma', 'Movie')
    (5, 'Tom', 'Math')
    (6, 'Ben', 'Statistics')

    정상적으로 변경되었다.

     

    DELETE

    마지막 레코드를 삭제해 보자.

    import pymysql
    
    db = pymysql.Connect(host='localhost', user='*1', password='*2', database='*3')
    cursor = db.cursor()
    
    query = "DELETE FROM students WHERE id = 6"
    cursor.execute(query)
    db.commit()

    데이터를 확인해 보면,

    (1, 'John', 'Music')
    (2, 'Sarah', 'Art')
    (3, 'Steve', 'Computer Science')
    (4, 'Emma', 'Movie')
    (5, 'Tom', 'Math')

    정상적으로 반영되어 있다.

     

    참고 - MySQL 설치

     

    Docker 기반 MySQL 설치하기

    Docker를 사용하여 MySQL을 설치하는 방법을 정리한다. docker-compose.yml YAML 파일의 기본 골격을 다음과 같이 작성한다. 파일내 변수로 선언한 내용은 직접 yml 파일에 그대로 기록하거나, 외부 파일로

    luran.me

     

    댓글(0)

    Designed by JB FACTORY