본문 바로가기

카테고리 없음

Python MySQL 연결 방식

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 방식의 장점

  1. SQL 추상화:
    • 복잡한 SQL 문장을 직접 작성하지 않아도 됨
    • Python 코드로 데이터를 조회, 삽입, 수정, 삭제 가능
  2. 생산성 향상:
    • 반복적인 SQL 코드를 줄이고, 객체 지향 프로그래밍 방식으로 개발 속도 향상
  3. 데이터베이스 독립성:
    • MySQL, PostgreSQL, SQLite 등 다양한 DBMS를 동일한 코드로 지원
  4. 보안 강화:
    • ORM은 기본적으로 SQL 인젝션 방어 기능을 제공

비교 분석표

라이브러리 속도 ORM 지원 비동기 주 사용 사례
PyMySQL ★★☆ No No 빠른 개발/테스트
SQLAlchemy ★★☆ Yes Yes 복잡한 쿼리/다중 DB 환경
mysql.connector ★★★ No No 공식 드라이버 필요시
mysqlclient ★★★★ No No 대규모 프로덕션 환경