같은 SQLAlchemy를 사용했는데,
어떤 코드는 df.to_sql()을 쓰고
어떤 코드는 engine.begin() + execute()를 쓰는 경우를 보면 헷갈리기 쉽습니다.
겉으로 보면 둘 다 DB에 데이터를 넣는 코드지만,
실제로는 역할과 추상화 수준이 완전히 다릅니다.
먼저 아래 코드는 pandas + SQLAlchemy 조합입니다.
df.to_sql(
name=table,
schema=schema,
con=engine,
if_exists="append",
index=False
)
이 방식은 데이터프레임을 통째로 테이블에 적재하는 용도입니다.
SQL을 직접 작성하지 않아도 되고,
“이 DataFrame을 저 테이블에 넣어줘”라는 의도 중심 API입니다.
비유하면, 엑셀 파일을 통째로 DB에 업로드하는 버튼에 가깝습니다.
반면 아래 코드는 SQLAlchemy의 Core 레벨 사용입니다.
with engine.begin() as conn:
conn.execute(
insert_sql,
{
"table_name": table_name,
"batch_id": batch_id,
"ingest_start_time": ingest_start_time,
"expected_record_count": expected_record_count,
"ingest_status": ingest_status,
"error_message": error_message,
},
)
이 방식은
- SQL을 직접 작성하고
- 파라미터를 명시적으로 바인딩하며
- 트랜잭션 단위까지 제어합니다.
즉, **“이 SQL을 이 값으로 정확히 실행해라”**에 가깝습니다.
로그 테이블, 메타데이터, 상태 기록처럼
한 건 한 건 의미가 중요한 데이터에 적합합니다.
차이를 한 번에 정리하면
- df.to_sql()
- 데이터프레임 중심
- 대량 적재에 적합
- SQL을 거의 의식하지 않음
- engine.execute()
- SQL 중심
- 정밀 제어 가능
- 로그, 상태, 이력 기록에 적합
같은 SQLAlchemy를 쓰지만,
하나는 고수준 래퍼, 하나는 저수준 엔진 접근이라고 이해하면 정확합니다.
to_sql()은 데이터프레임 적재용 고수준 API이고, engine.execute()는 SQL을 직접 제어하는 저수준 API로, 목적에 따라 역할이 명확히 다르다.
'파이썬 > 기초 프로그래밍' 카테고리의 다른 글
| SQLAlchemy에서 text()와 fetchone()의 역할 정리 (0) | 2026.02.04 |
|---|---|
| SQLAlchemy INSERT 구문에서 values 딕셔너리는 어떻게 매핑될까 (0) | 2026.02.03 |
| 파이썬에서 모듈 전역 변수는 왜 함수 파라미터 없이도 사용할 수 있을까 (0) | 2026.02.03 |
| 데이터 엔지니어링에서 Enum을 활용한 ETL 파이프라인 설계 (0) | 2025.11.28 |
| 파이썬 Descriptor를 활용한 속성 제어 예제 (0) | 2025.09.15 |