docker-composeでFastAPI+SQLAlchemy+SQlite

2022年12月24日

ソース

  • ソースはこちら(https://github.com/ttnt-1013/FastAPIandSQLAlchemy
    • docker-compose up -dで動くはず(http://localhost:8000/docsから自動生成されたAPIのドキュメントが見れる)
    • 実験用のため、必要と思われるファイルはマウントするようにしている
    • SQLiteをRaspberryPiで動かそうと思っていたので、サービス名はedgedb-apiにした
  • だいぶ荒いので後日修正する可能性あり

環境

  • MacOSX Monterey
% docker --version
Docker version 20.10.11, build dea9396
% docker-compose version
Docker Compose version v2.2.1

構成

  • ディレクトリ構成は下記の通り
.
├── docker-compose.yml
├── docker
│   └── edgedb-api
│       └── Dockerfile   
└── edged-api
    ├── __init__.py
    ├── crud.py
    ├── database.py
    ├── main.py
    ├── models.py
    └── schemas.py

概要

  • main.pyで初期処理(ここでは、Statusのレコード全削除して一つだけ挿入している)、作りたいAPIのパスと処理を記述する
  • DBとの連携のうち、セッションはdatabase.py、DBデータへアクセスするコードはcrud.py、APIのスキーマはschemas.pyに記述している
  • APIを追加する際には下記の編集が必要
    • schemas.py:POSTで引数があるのであればスキーマを作成
    • crud.py:DBデータの処理を記述
    • main.py:パスを設定し、crud.pyの関数を呼び出す処理を記述
    • (新しいモデルを使う場合にはmodels.pyを編集)
from fastapi import Depends, FastAPI
from sqlalchemy.orm import Session

import app.crud as crud
import app.models as models
import app.schemas as schemas
from app.database import SessionLocal, engine

models.Base.metadata.create_all(bind=engine)

app = FastAPI()
crud.initialize_status(SessionLocal())

def get_db():
   db = SessionLocal()
   try:
       yield db
   finally:
       db.close()
 
@app.get("/get-status/")
def get_status(db: Session = Depends(get_db)):
   return crud.get_status(db)

@app.post("/update-status/")
def update_status(status: schemas.StatusUpdate, db: Session = Depends(get_db)):
   return crud.update_status(db=db, status=status)

参考にしたサイト