関連記事

FastAPI + postgressのアプリ構築メモ part.1 環境構築
FastAPI + postgressのアプリ構築メモ part.2 CREATE
FastAPI + postgressのアプリ構築メモ part.3 READ (イマココ)

今回やること

前回はデータのcreateをやったので、DBの中身を取得するRの処理を実装していきます

READ

base_models.py

from pydantic import BaseModel
from datetime import datetime

class News(BaseModel):
    title: str
    link: str
    created_at: datetime

news_handlers.py

from fastapi import HTTPException
from sqlalchemy import desc
from sqlalchemy.exc import SQLAlchemyError

# my modules
from models import NEWS
from database import Session
from lib.base_models import *

def get_5_latest_news():
    latest_news = []
    try:
        ses = Session()
        news_5 = ses.query(NEWS).order_by(desc(NEWS.created_at)).limit(5).all()
        for news in news_5:
            news_tmp = News(
                title      = news.title,
                link       = news.link,
                created_at = news.created_at
            )
            latest_news.append(news_tmp)
    except SQLAlchemyError:
        raise HTTPException(status_code=500, detail="db check failed")
    finally:
        ses.close()

    return latest_news

news.py

from fastapi import APIRouter
from typing import List

# my modules
from lib.news_handlers import add_news_to_db, get_5_latest_news
from lib.base_models import *

router = APIRouter()

@router.get("/news/latest_news", response_model=List[News], tags=["news"])
async def get_latest_news():
    return get_5_latest_news()

これでDBのレコードを取得してreturnすることができるようになりました