python 환경에서 MySQL DB에 연결할 수 있는 방법들과, 그 장단점에 대해 알아보자.
아래는 살펴볼 4가지 방식이다.
- pymysql : 순수 파이썬 구현, 설치가 쉬움.
- sqlalchemy : ORM 방식, 다양한 DB 지원.
- mysql.connector : MYSQL 공식 지원, 호환성 좋음.
- mysqlclient : 빠른 속도, C로 구현되어 C 컴파일러 필요.
상황에 따라 무엇을 쓰면 좋을지 생각해보자면,,,
일반적인 (크지않은 데이터)를 다루는 상황이라면 pymysql을 추천한다.
데이터의 크기가 보다 크거나 SSL/TLS과 같은 보안 연결이 필요한 경우 mysql.connector를 추천하고,
ORM방식을 선호하거나, MySQL외에도 PostrgreSQL과 같이 다른 db를 함께 사용하는 상황이라면 sqlalchemy를 추천한다.
mysqlclient는 mysql.connector로도 속도가 느리게 느껴질 때 (대규모 데이터) 채택하도록 하자...!
각 방식별 기본적인 연결 및 사용 코드를 살펴보자.
1. PyMySQL (Pure Python)
pythonimport pymysql
*# 연결 설정*
conn = pymysql.connect(
host='localhost',
user='user',
password='password',
database='test_db',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor *# 딕셔너리 형식 결과 반환 [2]*
)
try:
with conn.cursor() as cursor:
*# 데이터 삽입*
sql = "INSERT INTO users (email, password) VALUES (%s, %s)"
cursor.execute(sql, ('user@example.com', 'secret'))
*# 데이터 조회*
cursor.execute("SELECT * FROM users WHERE email=%s", ('user@example.com',))
result = cursor.fetchone()
print(result)
conn.commit()
finally:
conn.close()
2. SQLAlchemy (ORM)
pythonfrom sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
*# 엔진 생성*
engine = create_engine('mysql+pymysql://user:password@localhost/test_db')
*# ORM 모델 정의*
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(50))
email = Column(String(120))
*# 세션 생성*
Session = sessionmaker(bind=engine)
session = Session()
*# CRUD 작업*
new_user = User(name='John Doe', email='john@example.com')
session.add(new_user)
session.commit()
*# 조회*
users = session.query(User).filter_by(name='John Doe').all()
for user in users:
print(user.email)
3. mysql.connector (공식 드라이버)
pythonimport mysql.connector
from mysql.connector import Error
try:
conn = mysql.connector.connect(
host='localhost',
database='test_db',
user='user',
password='password',
auth_plugin='mysql_native_password' *# 인증 플러그인 명시 [4]*
)
if conn.is_connected():
cursor = conn.cursor()
*# 배치 삽입*
data = [('user1', 'pwd1'), ('user2', 'pwd2')]
cursor.executemany("""
INSERT INTO users (username, password)
VALUES (%s, %s)
""", data)
*# 커밋*
conn.commit()
except Error as e:
print(f"Error: {e}")
finally:
if conn.is_connected():
cursor.close()
conn.close()
4. mysqlclient (C 확장)
pythonimport MySQLdb
from MySQLdb import cursors
*# 연결 풀 사용 (고성능)*
conn = MySQLdb.connect(
host="127.0.0.1",
user="user",
passwd="password",
db="test_db",
connect_timeout=5,
cursorclass=cursors.SSCursor *# 서버 사이드 커서 [5]*
)
try:
with conn.cursor() as cursor:
*# 대용량 스트리밍 처리*
cursor.execute("SELECT * FROM large_table")
*# 1000개 단위 청크 처리*
while True:
rows = cursor.fetchmany(1000)
if not rows:
break
process_data(rows) *# 사용자 정의 처리 함수*
conn.commit()
except MySQLdb.OperationalError as e:
print(f"Operational Error: {e}")
finally:
conn.close()
처음 보는 사람이라면 생길만한 궁금증..?
1. Cursor란 무엇인가?
Cursor는 Python에서 데이터베이스와 상호작용할 때 사용되는 객체로, SQL 쿼리를 실행하고 그 결과를 가져오는 데 사용됩니다. Cursor는 데이터베이스 연결(Connection) 객체에서 생성되며, 데이터베이스 작업의 핵심 역할을 합니다.
Cursor의 주요 역할
- SQL 실행: execute() 메서드를 통해 SQL 문장을 실행합니다.
- 결과 가져오기: SELECT 쿼리의 결과를 가져오기 위해 사용됩니다.
- fetchone(): 한 행만 가져옴.
- fetchall(): 모든 행을 가져옴.
- fetchmany(n): 지정된 개수의 행만 가져옴.
- 파라미터 바인딩: SQL 쿼리에 파라미터를 안전하게 전달하여 SQL 인젝션을 방지합니다.
Cursor의 특징
- 데이터베이스와 Python 간의 중간 인터페이스 역할을 합니다.
- 데이터를 한 번에 가져오거나 필요한 만큼만 가져오는 방식으로 메모리 효율성을 제공합니다.
- 트랜잭션 관리도 가능하며, 커밋(commit) 또는 롤백(rollback)을 수행할 수 있습니다.
2. ORM(객체 관계 매핑, Object Relational Mapping)이란?
ORM은 데이터베이스와 상호작용하는 방법 중 하나로, 테이블과 같은 데이터베이스 구조를 객체(Object)로 매핑하여 SQL 대신 객체 지향 프로그래밍 방식으로 데이터를 다룰 수 있게 해줍니다.
ORM의 주요 개념
- 테이블 → 클래스: 데이터베이스의 테이블은 Python 클래스에 매핑됩니다.
- 행(Row) → 객체(Object): 테이블의 각 행은 클래스의 인스턴스(객체)로 표현됩니다.
- 열(Column) → 속성(Attribute): 테이블 열은 클래스 속성으로 매핑됩니다.
ORM 방식의 장점
- SQL 추상화:
- 복잡한 SQL 문장을 직접 작성하지 않아도 됨
- Python 코드로 데이터를 조회, 삽입, 수정, 삭제 가능
- 생산성 향상:
- 반복적인 SQL 코드를 줄이고, 객체 지향 프로그래밍 방식으로 개발 속도 향상
- 데이터베이스 독립성:
- MySQL, PostgreSQL, SQLite 등 다양한 DBMS를 동일한 코드로 지원
- 보안 강화:
- ORM은 기본적으로 SQL 인젝션 방어 기능을 제공
비교 분석표
라이브러리 | 속도 | ORM 지원 | 비동기 | 주 사용 사례 |
PyMySQL | ★★☆ | No | No | 빠른 개발/테스트 |
SQLAlchemy | ★★☆ | Yes | Yes | 복잡한 쿼리/다중 DB 환경 |
mysql.connector | ★★★ | No | No | 공식 드라이버 필요시 |
mysqlclient | ★★★★ | No | No | 대규모 프로덕션 환경 |