python DB 연결 라이브러리 모음

김윤하·2023년 12월 27일

Python

목록 보기
10/11

1. DB 연결을 왜 해야하나?

python을 통해서 데이터를 분석하거나 전처리하기 위해서는 우선 데이터가 필요하고 보통 데이터를 DB에 저장하기 때문이다. 그렇다면 어떤 작업을 해야할까? 1) DB에 연결하기 2) MySQL 데이터를 불러오기 3) MySQL에 데이터를 내보내거나 수정하기, 여기엔 주로 pymysql과 sqlalchemy 두 가지 라이브러리가 많이 쓰이는데 그 사용법을 다루어보겠다.

1-1) pymysql과 SQLAlchemy 차이

  • 주로 pymysql과 sqlalchemy의 가장 큰 차이로 말하는 것은 ORM(Object Relational Mapping)의 활용 여부로 SQLAlchemy는 ORM을 사용할 수 있다.

  • ORM은 쓰이는 객체라는 개념을 구현한 클래스와 RDB에서 쓰이는 데이터인 테이블 자동으로 매핑(연결)하는 것을 의미한다. 그러나 클래스와 테이블은 서로가 기존부터 호환가능성을 두고 만들어진 것이 아니기 때문에 불일치가 발생하는데, 이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다. 따라서 ORM을 이용하면 따로 SQL문을 짤 필요없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있게 된다.

  • SQLAlchemy의 Session은 ORM을 통한 객체 지향적인 데이터베이스 상호 작용을 제공하며, pymysql의 Connection은 저수준의 SQL 쿼리 실행 및 데이터베이스와의 직접적인 상호 작용을 제공합니다. 선택은 프로젝트의 요구사항과 개발 스타일에 따라 다를 수 있습니다.

1-2) pymysql 사용

# 1.connection을 생성
conn = pymysql.connect(
		host='',            # mysql server의 주소
		port='3306',        # mysql server의 포트 번호
		user='id',     	    # user id
		passwd='pw',        # user pw
		db=''               # database명
		charset=''          # 'utf8' 등 문자 인코딩 설정
)

cur = conn.cursor()

sql = 'select * from table'

cur.execute(sql)
result = cur.fetchall()  # fetchone(), fetchmany() 등

여기서 cursor 란?

  • DB connection에 대하여 독립적으로 SQL 문을 실행할 수 있는 작업환경을 제공하는 객체

1-3) SQLAlchemy 사용

import pandas as pd
from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker


engine = create_engine("mysql+pymysql://[id]:[pw]@[mysql주소]:[port]/[db_name]?charset=utf8", encoding='utf-8')

# 1.위처럼 직접 connection을 생성
conn = engine.connect()

# 2.session을 생성하여 활용하기
session = sessionmaker(bind=self.engine, autocommit=False)

# 3.engine을 활용한 dataframe.to_sql()
df = pd.DataFrame()
df.to_sql(name="table", con=engine, if_exists='append', index=False)

2) 주의할점

python을 사용하면서 자원의 사용과 반환은 항상 중요한 문제로 거론된다 .
여기서 DB connection 또한 그 중 하나이며 이를 with 구문을 활용하여 사용할 수 있도록 구현하면 좋다.
(example)

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker


class DbBase:
    def __init__(self):
        self.address = None
        self.engine = None
		...

    def get_mysql_address(self):
        return 'make_your_db_address'

    def __enter__(self):
        self.engine = create_engine(self.address, echo=False)
        session = sessionmaker(bind=self.engine, autocommit=False)
        self.session = session(bind=self.engine)
        return self

    def __exit__(self, type, value, traceback):
        if self.session:
            self.session.close()
profile
data engineer

0개의 댓글