카테고리 없음
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을 손쉽게 연동해보세요! 🚀🐍💻