👩‍💻 Develope/Python

[Pandas] SQL 쿼리로 데이터프레임으로 불러오기 (read_sql)

heywantodo 2024. 12. 17. 18:01
728x90
반응형

[Pandas] SQL 쿼리로 데이터프레임으로 불러오기 (read_sql)

`read_sql`은 SQL 쿼리의 결과를 Pandas 데이터 프레임으로 불러오는 방법을 제공한다. 

데이터베이스의 데이터를 직접 조작하고 시각화할 때 주로 사용한다.

 

read_sql()

일반적으로 SQLAlchemy 엔진 또는 데이터베이스 커넥션 객체(sqlite3)와 함께 사용된다.

이 함수는 `SELECT` 쿼리 뿐만 아니라 테이블 전체를 가져오는 기능도 지원한다.

import pandas as pd
df = pd.read_sql(sql, con)

 

SELECT 쿼리를 실행하여 DataFrame으로 불러오기

이 포스팅에선 `SQLAlchemy` 엔진을 생성하여 쿼리를 실행하고 데이터프레임으로 불러온다.

먼저 SQLAlchemy 패키지를 설치후 엔진을 생성한다.

##패키지 없으면 설치##
pip insqll sqlalchemy
#####################

from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://username:password@host:port/database")

그 후 SQL 쿼리를 작성하여 결과 값을 데이터 프레임으로 변환한다.

import pandas as pd
query = '''
    SELECT 
     id,
     name,
     age,
     created_at
    FROM
     users
    WHERE
      age > 30
'''

# SQL 쿼리 실행 후 DataFrame으로 변환
df = pd.real_sql(sql=query, con=engine)

 

테이블 전체 불러오기

`read_sql()`은 SQL 쿼리뿐 아니라테이블 이름으로도 데이터를 불러올 수 있다.

다만 테이블 이름을 직접 넘길 경우, 일부 데이터베이스에는 에러가 발생할 수 있다.

df = pd.read_sql(sql='users', con=engine)

 

WHERE 조건절에 매개변수 사용하기

`read_sql()`은 파라미터를 동적으로 바인딩할 수 있는 기능도 지원한다.

해당 기능을 사용하면 조건을 외부에서 동적으로 제어가 가능하다.

age_threshold = 30

query = '''
    SELECT
      id,
      name,
      age,
      created_at
    FROM
      users
    WHERE
      age > :age_threshold
'''

# 매개 변수 전달 (params 인자)
df = pd.read_sql(sql=query, con=engine, parmas={"age_threshole":age_threshold})

 

특정 컬럼을 인덱스로 불러오기

`index_col` 매개변수로 인덱스 컬럼을 지정할 수도 있다.

df = pd.read_sql(sql=query, con=engine, index_col='id')

 

성능 최적화

chunksize 사용

대용량 데이터를 한꺼번에 불러오는 대신, 청크 단위로 불러올 수 있다.

`read_sql()`의 `chunksize` 매개변수를 설정하면, 지정된 크기 만큼의 데이터만 한 번에 불러온다.

chunk_size = 1000 # 1000개씩 불러오기

# chunksize를 지정하면, df는 반복 가능한 generator로 반환한다.
for chunk in pd.read_sql(sql=query, con=engine, chunksize=chunk_size):
    print(f"chunk 크기: {len(chunk)}")
    print(chunk.head())

 

728x90
반응형