본문 바로가기

TIL

[240329] 파이썬 sqlalchmey로 SQL DB 연동해 데이터 불러오기

1. 파이썬 - SQL DB 연동 

- 금번 최종 프로젝트에서 아마존 RDS에 데이터 베이스 구축

- sqlalchmey을 활용해 파이썬으로 SQL에 업로드 된 데이터베이스를 연동 

└ colab에서는 pymysql 라이브러리도 가능했지만, 로컬에서 vscode 사용 시 오류 발생하여 sqlalchmeyFH 진행 

# 라이브러리 불러오기
from sqlalchemy import create_engine
from urllib.parse import quote

# sqlalchemy로 DB 연동
# 접속 정보
user = 'xxx'
pwd = 'xxx'
host = 'xxx.amazonaws.com'
port = xxx
database = 'xxx'
db_url = f'mysql+pymysql://{user}:{quote(pwd)}@{host}:{port}/{database}'

# 데이터베이스와 엔진 연결
try :
    engine = create_engine(db_url)
        # with engine.connect() as connection:
        #     # Start an explicit control over transaction
    print('Olist DB에 연결되었습니다!')
except :
    print("예외 발생")

 

2. 데이터 프레임으로 저장하기 

# 함수로 SQL쿼리를 써서 전체 데이터프레임을 딕셔너리에 저장 
def from_SQL_DB(table_list: dict):
    ''' SQL DB에 있는 전체 데이터프레임을 
    파이썬으로 가져와 딕셔너리 형태로 저장하는 함수 '''
    df_dict = {}
    for table in table_list: 
        query = f'SELECT * FROM {table}'
        df_name = f'df_{table}'
        df = pd.read_sql(query, con=engine)
        df_dict[df_name] = df 
    return df_dict 
    
# DB 불러와서 DATA FRAME에 저장 
# DB 리스트
table_list = ['customers', 'geolocation', 'order_items', 'order_payments', 
              'order_reviews_notext', 'orders', 'products', 'sellers']

# 데이터프레임 이름과 값을 df_dic_list에 저장
df_dic_list = from_SQL_DB(table_list)

# 하나씩 불러와서 개별 데이터프레임 이름 변수에 값 저장 
for df_name, df in (df_dic_list.items()):
     globals()[df_name] = df
     print(df_name)

# 엔진 종료 처리 / 작업 완료 후 변경사항에 대해서는 별도 connect & commit 
engine.dispose()

# 저장된 데이터 프레임
# df_customers
# df_geolocation
# df_order_items
# df_order_payments
# df_order_reviews_notext
# df_orders
# df_products
# df_sellers

 

3. (참고) 파이썬에서 SQL 쿼리 작성

# pymysql 버전
# 코드 쿼리 작성
query = "SELECT * FROM orders"

# 데이터 프레임으로 변환
df = pd.read_sql(query, con)
print(df.shape)
df.head()