카테고리 없음

Database - Chapter 4-27. PyMySQL(3/3)

Chansman 2025. 3. 21. 18:13

🚀 PyMySQL로 MySQL 데이터베이스 다루기 (CRUD 연습 및 리팩토링)

이번 포스팅에서는 PyMySQL을 이용하여 MySQL 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 하는 예시 코드와 이를 깔끔하게 리팩토링하는 방법을 함께 알아보겠습니다.


📌 원본 코드(app.py)

🔹 기본 코드 구조 설명

아래 코드는 PyMySQL을 이용하여 데이터베이스와 연결하고, 데이터 조회(SELECT), 삽입(INSERT), 수정(UPDATE), 삭제(DELETE) 작업을 수행하는 기본적인 구조입니다.

📋 코드 예시

import pymysql

def main():
    # 데이터베이스 연결 설정
    connection = pymysql.connect(host='localhost',
                                 user='username',
                                 password='password',
                                 db='database_name',
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.DictCursor)
    try:
        # SELECT 연산
        with connection.cursor() as cursor:
            sql = "SELECT * FROM table_name"
            cursor.execute(sql)
            result = cursor.fetchall()
            print("🔍 SELECT 연산 결과:")
            for row in result:
                print(row)

        # INSERT 연산
        with connection.cursor() as cursor:
            sql = "INSERT INTO table_name (column1, column2) VALUES (%s, %s)"
            cursor.execute(sql, ('data1', 'data2'))
        connection.commit()
        print("✏️ INSERT 연산 수행됨.")

        # UPDATE 연산
        with connection.cursor() as cursor:
            sql = "UPDATE table_name SET column1=%s WHERE column2=%s"
            cursor.execute(sql, ('new_data', 'criteria'))
        connection.commit()
        print("🔄 UPDATE 연산 수행됨.")

        # DELETE 연산
        with connection.cursor() as cursor:
            sql = "DELETE FROM table_name WHERE column_name=%s"
            cursor.execute(sql, ('criteria',))
        connection.commit()
        print("🗑️ DELETE 연산 수행됨.")

    finally:
        # 데이터베이스 연결 종료
        connection.close()

if __name__ == "__main__":
    main()

✅ 주요 설명

  • 각 연산마다 connection.cursor()를 사용하여 별도의 커서를 생성합니다.
  • 데이터를 수정하거나 삭제한 후에는 반드시 connection.commit()을 호출해 데이터베이스에 적용합니다.

📌 리팩토링한 코드(app.py)

🔹 리팩토링의 목적

  • 중복되는 코드를 제거하여 코드의 가독성을 높입니다.
  • 재사용 가능한 공통 함수를 만들어 유지보수를 간편하게 합니다.

📋 리팩토링 코드 예시

import pymysql

def execute_query(connection, query, args=None):
    with connection.cursor() as cursor:
        cursor.execute(query, args or ())
        if query.strip().upper().startswith('SELECT'):
            return cursor.fetchall()
        else:
            connection.commit()

def main():
    connection = pymysql.connect(host='localhost',
                                 user='username',
                                 password='password',
                                 db='database_name',
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.DictCursor)

    try:
        # SELECT 연산
        result = execute_query(connection, "SELECT * FROM table_name")
        print("🔍 SELECT 연산 결과:")
        for row in result:
            print(row)

        # INSERT 연산
        execute_query(connection, "INSERT INTO table_name (column1, column2) VALUES (%s, %s)", ('data1', 'data2'))
        print("✏️ INSERT 연산 수행됨.")

        # UPDATE 연산
        execute_query(connection, "UPDATE table_name SET column1=%s WHERE column2=%s", ('new_data', 'criteria'))
        print("🔄 UPDATE 연산 수행됨.")

        # DELETE 연산
        execute_query(connection, "DELETE FROM table_name WHERE column_name=%s", ('criteria',))
        print("🗑️ DELETE 연산 수행됨.")

    finally:
        connection.close()

if __name__ == "__main__":
    main()

✅ 리팩토링 코드의 장점

  • 하나의 함수로 CRUD 연산을 통합하여 코드가 더 깔끔해졌습니다.
  • 유지보수가 쉬워졌으며, 새로운 쿼리를 추가할 때도 매우 편리합니다.

💡 추가 꿀팁

  • SELECT 결과가 매우 클 때는 fetchone() 또는 fetchmany(size)를 사용하여 메모리 효율을 높일 수 있습니다.
  • UPDATE와 DELETE 연산 시 항상 조건을 명확히 하여 중요한 데이터를 실수로 수정하거나 삭제하지 않도록 주의하세요.

이제 PyMySQL을 더욱 효율적으로 활용하여 Python과 MySQL을 손쉽게 연동해보세요! 🚀🐍💻