데이터 분석/FastAPI

Fastapi: 프로젝트로 바로 적용하는 학습(1)

민서타 2024. 1. 31. 01:50

개요: 특정 스타트업의 아이템 추천시스템 구축

로직: streamlit 고객 입력(프론트) -> fastapi(백엔드, db쿼리 전달) -> db ->fastapi 모델서빙 -> 스트림릿


FastApi <-> mysql 연결 (local) #sqlalchemy을 통해 파이썬으로 연동 가능

1) 엔진 생성 - 세션생성 - Base 모델 선언(입력 데이터를 json형식, mysql 타입으로 가공하기 위한) - 엔드포인트 설정

 나의 경우, 데이터가 이미 쌓여있을 것이라 가정하고, mysql에 user_input 테이블을 미리 만들어두었다.

from fastapi import FastAPI
from pydantic import BaseModel
from sqlalchemy import create_engine, Column, String, Integer, TEXT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from enum import Enum
from typing import List, Optional
#import mysql.connector
#from mysql.connector import Error

# FastAPI 인스턴스 생성
app = FastAPI()

# MySQL 데이터베이스 연결 설정
DATABASE_URL = "mysql+mysqlconnector://사용자이름:비밀번호@호스트/db이름"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# SQLAlchemy 모델 정의
Base = declarative_base()

class UserInput(Base):
    __tablename__ = "user_input"
    id = Column(Integer, primary_key=True, index=True)
    customer_id = Column(String, index=True)
    password = Column(String)
    name = Column(String)
    gender = Column(String)
    age = Column(Integer)
    child_age = Column(Integer)
    child_gender = Column(String)
    parenting_concerns = Column(TEXT)

# Pydantic 모델 정의 (FastAPI의 request body를 검증하기 위해)
class GenderEnum(str, Enum):
    Male = "Male"
    Female = "Female"

class UserInputRequest(BaseModel):
    customer_id: str
    password: Optional[str]
    name: str
    gender: GenderEnum
    age: int
    child_age: int
    child_gender: GenderEnum
    parenting_concerns: List[str]

# FastAPI 엔드포인트 정의
@app.post("/submit_user_input")
def submit_user_input(user_input: UserInputRequest):
    # 입력 받은 데이터를 SQLAlchemy 모델에 매핑
    db_user_input = UserInput(
        customer_id=user_input.customer_id,
        password=user_input.password,
        name=user_input.name,
        gender=user_input.gender.value,
        age=user_input.age,
        child_age=user_input.child_age,
        child_gender=user_input.child_gender.value,
        parenting_concerns=",".join(user_input.parenting_concerns)
    )

    # 데이터베이스에 세션을 만들어서 데이터 추가
    db = SessionLocal()

    # 이미 존재하는 테이블에 데이터 추가
    db.execute(
        UserInput.__table__.insert().values(
            customer_id=db_user_input.customer_id,
            password=db_user_input.password,
            name=db_user_input.name,
            gender=db_user_input.gender,
            age=db_user_input.age,
            child_age=db_user_input.child_age,
            child_gender=db_user_input.child_gender,
            parenting_concerns=db_user_input.parenting_concerns
        )
    )

    # 커밋
    db.commit()

    return {"message": "User input submitted successfully"}
반응형