25~27.PyMysQL
Get Notion free

25~27.PyMysQL

PyMySQL란?

PyMySQL은 Python에서 MySQL 데이터베이스를 사용하기 위한 라이브러리
PyMySQL을 사용하면 Python 코드를 통해 MySQL 데이터베이스에 접속하고, 데이터를 조회, 삽입, 수정, 삭제할 수 있습니다.

1. PyMySQL 설치

PyMySQL은 pip를 통해 쉽게 설치할 수 있습니다. 터미널이나 명령 프롬프트에서 다음 명령어를 실행합니다:
pip install pymysql

2. PyMySQL을 사용한 데이터베이스 접속

PyMySQL을 사용하여 MySQL 데이터베이스에 접속하는 기본적인 코드 구조는 다음과 같습니다:
import pymysql # 데이터베이스 연결 설정 connection = pymysql.connect(host='localhost', user='root', password='oz-password', db='classicmodels', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) try: # 커서 생성 with connection.cursor() as cursor: # SQL 쿼리 실행 sql = "YOUR_SQL_QUERY" cursor.execute(sql) # 결과 받아오기 result = cursor.fetchall() print(result) finally: # 데이터베이스 연결 종료 connection.close()
charset='utf8mb4'
이 설정은 데이터베이스 연결에 사용되는 문자 집합을 지정합니다.
utf8mb4
는 MySQL에서 유니코드를 완벽하게 지원하기 위한 문자 집합으로, 이모지를 포함한 모든 유니코드 문자를 지원합니다.
데이터베이스에 다양한 언어의 문자 데이터를 저장하거나, 이모지 등의 4바이트 유니코드 문자를 사용할 경우 이 설정이 필요합니다.
cursorclass
Default Cursor (
pymysql.cursors.Cursor
): 기본 커서 클래스로, 결과를 튜플 형식으로 반환합니다. 각 행은 값들의 튜플로 나타나며, 열 이름 정보는 포함하지 않습니다.
DictCursor (
pymysql.cursors.DictCursor
): 이 커서 클래스는 결과를 딕셔너리 형식으로 반환합니다. 각 행은 열 이름을 키로 하고 해당 데이터를 값으로 하는 딕셔너리로 나타납니다. 이는 결과를 처리할 때 열 이름으로 데이터에 접근할 수 있게 해줘 편리합니다.
SSCursor (
pymysql.cursors.SSCursor
): 서버 사이드 커서로, 큰 결과 집합을 처리할 때 유용합니다. 이 커서는 모든 결과를 한 번에 메모리에 로드하지 않고, 필요할 때마다 서버에서 행을 가져옵니다.
SSDictCursor (
pymysql.cursors.SSDictCursor
): 서버 사이드 딕셔너리 커서로,
SSCursor
의 기능에 딕셔너리 형식의 결과 반환을 추가합니다. 큰 데이터 집합에서 열 이름으로 데이터에 접근해야 할 때 유용합니다.
NamedTupleCursor (
pymysql.cursors.NamedTupleCursor
): 이 커서는 결과를 명명된 튜플(namedtuple) 형식으로 반환합니다. 각 행은 필드 이름으로 접근 가능한 튜플로 나타납니다. 이는 열 이름으로 데이터에 접근할 수 있으면서도 튜플의 간결함을 유지합니다.
cursorclass=pymysql.cursors.DictCursor
이 설정은 데이터베이스 쿼리의 결과를 어떻게 반환할지 결정합니다.
기본적으로 PyMySQL은 쿼리 결과를 튜플(tuple) 형태로 반환합니다.
DictCursor
를 사용하면 쿼리 결과를 딕셔너리(dictionary) 형태로 받을 수 있어, 각 열의 이름으로 결과에 접근할 수 있습니다. 이는 결과 데이터를 처리할 때 더 직관적이고 편리할 수 있습니다.
{ 'column_name1': 'value1', 'column_name2': 'value2', ... }
DictCursor
SSDictCursor
DictCursor
SSDictCursor
는 PyMySQL에서 사용되는 두 종류의 커서입니다. 두 커서 모두 쿼리 결과를 딕셔너리 형식으로 반환하는 것은 같지만, 데이터를 처리하는 방식에서 차이가 있습니다.
DictCursor
: 이 커서는 쿼리 결과를 딕셔너리 형식으로 반환합니다. 이 경우, 쿼리의 전체 결과가 클라이언트의 메모리에 한 번에 로드됩니다. 이 방식은 결과 집합이 상대적으로 작을 때 효과적입니다.
SSDictCursor
(Server-Side DictCursor): 이 커서도 결과를 딕셔너리 형식으로 반환하지만, 서버 사이드 커서의 특징을 가집니다. 즉, 쿼리의 전체 결과를 한 번에 메모리에 로드하지 않고, 필요할 때마다 서버에서 데이터를 가져옵니다. 이는 큰 결과 집합을 처리할 때 메모리 사용량을 줄이고 효율을 높이는 데 유용합니다.
결론적으로, 작은 데이터 세트를 다룰 때는
DictCursor
를 사용하는 것이 좋고, 큰 데이터 세트를 다룰 때는
SSDictCursor
를 사용하는 것이 더 효율적입니다. 그러나
SSDictCursor
는 데이터를 서버에서 점진적으로 가져오기 때문에, 작은 데이터 세트에 대해서도 사용할 수 있지만, 이 경우에는
DictCursor
에 비해 약간의 오버헤드가 발생할 수 있습니다. 따라서 적절한 커서 선택은 사용 사례와 데이터 세트의 크기에 따라 달라질 수 있습니다.

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()

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()

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()

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()
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: 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()
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()