카테고리 없음

Database - Chapter 4-26. PyMySQL(2/3)

Chansman 2025. 3. 21. 16:20

🚀 Python과 PyMySQL로 MySQL 데이터베이스 다루기

📌 3. 데이터 조회 (SELECT)

MySQL 데이터베이스에서 데이터를 조회하는 예시입니다:

try:
    with connection.cursor() as cursor:
        sql = "SELECT * FROM table_name"
        cursor.execute(sql)
        result = cursor.fetchall()
        for row in result:
            print(row)
finally:
    connection.close()

Tip: fetchall()은 모든 데이터를 가져옵니다. 특정 개수만 가져오고 싶다면 fetchone() 또는 fetchmany(size)를 사용하세요.


📌 4. 데이터 삽입 (INSERT)

데이터를 삽입하는 예시는 다음과 같습니다:

try:
    with connection.cursor() as cursor:
        sql = "INSERT INTO table_name (column1, column2) VALUES (%s, %s)"
        cursor.execute(sql, ('data1', 'data2'))

    connection.commit()
finally:
    connection.close()

Tip: 데이터 삽입 후에는 반드시 commit()을 호출하여 변경 사항을 데이터베이스에 저장하세요.


📌 5. 데이터 수정 (UPDATE)

기존 데이터를 수정하는 방법은 다음과 같습니다:

try:
    with connection.cursor() as cursor:
        sql = "UPDATE table_name SET column1=%s WHERE column2=%s"
        cursor.execute(sql, ('new_data', 'criteria'))

    connection.commit()
finally:
    connection.close()

Tip: 정확한 조건(WHERE)을 설정하여 의도치 않은 데이터를 수정하지 않도록 주의하세요.


📌 6. 데이터 삭제 (DELETE)

데이터를 삭제하는 예시 코드입니다:

try:
    with connection.cursor() as cursor:
        sql = "DELETE FROM table_name WHERE column_name=%s"
        cursor.execute(sql, ('criteria',))

    connection.commit()
finally:
    connection.close()

Tip: 삭제는 되돌릴 수 없으니 항상 삭제 조건을 신중히 선택하세요.


📌 예제: CRUD 전체 과정 (app.py)

기본 버전

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:
            cursor.execute("SELECT * FROM table_name")
            result = cursor.fetchall()
            print("SELECT 결과:")
            for row in result:
                print(row)

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

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

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

    finally:
        connection.close()

if __name__ == "__main__":
    main()

📌 리팩토링 버전 (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()
        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()

리팩토링 Tip: 함수로 쿼리를 실행하는 로직을 묶으면 중복을 피하고 유지보수도 쉬워집니다!