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