Thoughts, stories and ideas.

[Python] dataframe - batch insert to db

DataFrame 데이터를 SQL 데이터베이스로 배치 인서트하는 것은 데이터를 효율적으로 이동시키는 일반적인 작업입니다. 이를 위해 Python의 pandas 라이브러리와 SQLAlchemy 또는 pandas 자체의 기능을 사용할 수 있습니다. 여기에는 몇 가지 방법이 있습니다.

  1. Pandas의 to_sql 메서드 사용
    Pandas의 DataFrame.to_sql 메서드는 DataFrame을 SQL 데이터베이스 테이블로 직접 전송할 수 있는 간편한 방법을 제공합니다.
from sqlalchemy import create_engine
import pandas as pd

# 데이터베이스 연결 생성
engine = create_engine('postgresql://username:password@host:port/database')

# DataFrame을 SQL 테이블로 인서트
df.to_sql('table_name', engine, if_exists='append', index=False)

create_engine은 SQLAlchemy를 사용하여 데이터베이스에 연결합니다.
to_sql 메서드는 DataFrame을 SQL 테이블로 인서트합니다. if_exists 옵션은 테이블이 이미 존재할 때의 동작을 정의합니다 ('append', 'replace', 'fail' 중 하나).
2. SQLAlchemy 사용하여 배치 인서트 수행
더 복잡한 시나리오에서는 SQLAlchemy의 Core나 ORM을 사용하여 배치 인서트를 수행할 수 있습니다.

from sqlalchemy import create_engine, Table, MetaData

# 데이터베이스 연결 및 메타 데이터 객체 생성
engine = create_engine('postgresql://username:password@host:port/database')
metadata = MetaData(bind=engine)

# 대상 테이블 정의
table = Table('table_name', metadata, autoload=True)

# 배치 인서트 수행
with engine.connect() as conn:
    conn.execute(table.insert(), df.to_dict(orient='records'))

이 방법은 데이터베이스에 대한 더 세밀한 제어가 필요할 때 유용합니다.

기타

if_exists 옵션은 데이터베이스에 이미 해당 테이블이 존재할 때 어떻게 동작할지 결정하는 데 사용됩니다. 이 옵션에는 세 가지 주요 값이 있습니다:

'fail':

기본값입니다.
해당 이름의 테이블이 데이터베이스에 이미 존재하는 경우, ValueError를 발생시키고 아무것도 수행하지 않습니다.
'replace':

해당 이름의 테이블이 이미 존재하는 경우, 기존 테이블을 새로운 데이터로 대체합니다.
기존 테이블이 삭제되고 새로운 데이터로 새 테이블이 생성됩니다.
'append':

해당 이름의 테이블이 이미 존재하는 경우, 새 데이터를 기존 테이블에 추가합니다.
기존 테이블 구조에 맞게 데이터가 추가되며, 테이블 구조가 다른 경우 오류가 발생할 수 있습니다.