3. DB 설정, 모델 만들기

jw·2021년 6월 6일
0

fastapi 경험해보기

목록 보기
3/4
post-thumbnail
post-custom-banner

DB 설정

첫 게시물에서 보여드렸던

이 테이블 구조 대로 MySQL에 테이블을 만들어 보겠습니다.

MySQL 설정은 skip 할께요

CREATE TABLE diary (
	id varchar(36) NOT NULL PRIMARY KEY,
	content varchar(1000),
	`date` date NOT NULL,
	created datetime DEFAULT CURRENT_TIMESTAMP(),
	updated datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP()
);

default charset을 utf8mb4로 설정해놓고
위 SQL을 사용해 table을 생성했습니다.

model 만들기

이제 프로젝트 디렉토리에서
db 폴더 생성 후 안에 model.py에 ORM에서 사용할 model을 만들어볼게요.
연결을 위해 .env 파일에

user=(user)
pass=(password)
host=(db_host)
port=(db_port)
database=(db_name)

위 형식대로 접속정보를 우선 만들어주었습니다.

ORM으로 sqlalchemy, 엔진으로는 pymsql을 사용하겠습니다

pip install sqlalchemy, pymysql

그리고 model.py에 아래 내용을 작성했어요.

from sqlalchemy import Column, String, Date, DateTime
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Diary(Base):
    __tablename__ = "diary"
    id = Column(String(36), primary_key=True)
    content = Column(String(1000))
    date = Column(Date, nullable=False)
    created = Column(DateTime)
    updated = Column(DateTime)

그리고 db/db.py 파일에서 세션 접속을 만들어주었습니다.

pip install python-dotenv

python-dotenv 설치 후

import os
from contextlib import contextmanager

from dotenv import load_dotenv
from sqlalchemy import create_engine
from sqlalchemy.orm.session import sessionmaker


load_dotenv(verbose=True)
user = os.getenv("user")
password = os.getenv("pass")
host = os.getenv("host")
port = os.getenv("port")
database = os.getenv("database")

db_url = f"mysql+pymysql://{user}:{password}@{host}:{port}/{database}?charset=utf8"
Session = sessionmaker()

db = create_engine(db_url, encoding="utf-8", pool_recycle=500)
Session.configure(bind=db, expire_on_commit=False)


@contextmanager
def session_scope():
    session = Session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()

contextmanager를 사용해 with 문으로 session을 사용할 수 있게 만들었어요.

테스트~

그럼 이제 test용 api를 작성해 보겠습니다.

main.py에서 전 시간까지 작성했던 테스트용 api를 지우고
아래 내용처럼 작성해보았습니다.

from typing import Optional

from fastapi import FastAPI
from fastapi import Query

from db.db import session_scope
from db.model import Diary


app = FastAPI()


@app.get("/diary")
def get_all_diary():
    with session_scope() as session:
        diarys = session.query(Diary).all()
        return diarys

자 이제 /diary로 접속했을 때, 모든 data가 응답으로 온다면 성공이겠네요!
그런데.. 지금은 data가 없으니 수동으로 data를 두 개 넣어주었습니다.

이제 실행해볼까요?

uvicorn main:app --reload

그리고 localhost:8000/diary로 접속해보면?

잘 왔네요! 🥳

그럼 다음 게시물에서는 위 내용을 가지고
db middleware 추가, response_model validation 적용하기를 해 보겠습니다~

profile
개발 공부중입니다!
post-custom-banner

0개의 댓글