FastAPI+PostgreSQLでデータ削除。DELETE文を実行する

本記事はPython初学者やFastAPIを学習したいと考えているWebエンジニア向けの入門者向けの記事になります。

この記事はFastAPIとPostgreSQLでデータ削除(DELETE)するAPIを作成したいと思います。

Pythonのインストールから実施しますので安心して記事を進めてみてください。

Pythonの高速APIのFastAPIを利用するシーンが多くなってきました。

案件でも使用する機会が増えてきたのでノウハウと公開したいと思います。

すこし前ですとPythonでWebアプリを作成するのはDjango一択でした。

ですが最近ではJavaScriptのフレームワーク(特にReact)+FastAPIで開発することが増えています。

JavaScriptフレームワーク+APIの構成で優れていると感じることはネイティブアプリでもコードや環境を流用することができる点です。

性能的に遅いと言われるPythonで文字通り高速なFastAPIを学習していただければと幸いです。

目次

ファイル構成とディレクトリ構成の確認

FastAPIのプロジェクトディレクトリの構成は以下になります。

fastapi/
 ├ venv/
 └ src/ 
   ├ alembic
   │  ├ env.py
   │  ├ README
   │  ├ script.py.mako
   │  └ versions/
   │    └ 1f3b2391d90c_create_users_table.py
   ├ alembic.ini
   ├ crud.py
   ├ database.py
   ├ main.py
   ├ models.py
   └ schemas.py

今回の記事で修正するファイルは以下になります。

修正するファイル
  • src/schemas.py
  • src/crud.py
  • src/main.py

今回新規に作成するファイルはありません。

まずはsrc/schemas.py を修正します。UserDeleteを追記してください。

from pydantic import BaseModel


class UserBase(BaseModel):
    name: str
    age: int
    email: str

    class Config:
        orm_mode = True


class UserPublic(UserBase):
    user_id: int
    name: str
    age: int
    email: str


class UserCreate(UserBase):
    user_id: int
    name: str
    age: int
    email: str


class UserUpdate(UserBase):
    user_id: int
    name: str
    age: int
    email: str

# 以下を追記
class UserDelete(UserBase):
    user_id: int
    name: str
    age: int
    email: str

次にsrc/crud.pyを修正します。delete_user関数を追記してください。

from sqlalchemy.orm import Session
import models
import schemas


# usersテーブルのデータをuser_idで取り出す。
def get_user(db: Session, user_id: int):
    return db.query(models.User).filter(models.User.user_id == user_id).first()


# usersテーブルのデータを全て取り出す
def get_all_user(db: Session):
    return db.query(models.User).all()


# usersテーブルにデータを追加
def create_user(db: Session, user: schemas.UserCreate):
    user_obj = models.User(
        name=user.name,
        age=user.age,
        email=user.email,
    )
    db.add(user)
    db.commit()
    db.refresh(user)
    return user_obj


# usersテーブルのデータ更新
def update_user(db: Session, user_id: int, user: schemas.UserUpdate):
    user_obj = get_user(db, user_id)
    if user_obj is not None:
        user_obj.name = user.name
        user_obj.age = user.age
        user_obj.email = user.email
        db.commit()
        db.refresh(user_obj)
    return user_obj


# 以下を追記
# usersテーブルのデータ削除
def delete_user(db: Session, user_id: int, user: schemas.UserDelete):
    user_obj = get_user(db, user_id)
    if user_obj is not None:
        db.delete(user_obj)
        db.commit()
    return user_obj

最後にsrc/main.pyを修正します。delete_user関数を追記します。

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List

from database import engine, get_db
import models
import schemas
import crud

app = FastAPI()



@app.get("/")
async def root():
    return {"message": "Hello World"}

@app.get("/user/{user_id}", response_model=schemas.UserPublic)
def get_user(user_id: int, db: Session = Depends(get_db)):
    db_user = crud.get_user(db=db, user_id=user_id)
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user


@app.get("/user/", response_model=List[schemas.UserPublic])
def get_all_user(db: Session = Depends(get_db)):
    db_users = crud.get_all_user(db=db)
    if db_users is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_users


@app.post("/user/create")
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    db_user = crud.create_user(db=db, user=user)
    return user

@app.post("/user/{user_id}", response_model=schemas.UserPublic)
def update_user(user: schemas.UserUpdate, user_id: int, db: Session = Depends(get_db)):
    db_user = crud.update_user(db=db, user_id=user_id, user=user)
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

# ここを追記
@app.post("/user/{user_id}/delete", response_model=schemas.UserPublic)
def update_user(user: schemas.UserDelete, user_id: int, db: Session = Depends(get_db)):
    db_user = crud.delete_user(db=db, user_id=user_id, user=user)
    if db_user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return db_user

これで準備完了です。

データの削除

では実際にFastAPIからデータを追加していきたいと思います。まずはFastAPIを起動します。

uvicorn main:app --reload --reload --workers 1 --host 0.0.0.0 --port 8000

今回使うツールもAdvanced rest clientになります。

今回はGoogle ChromeのAdvanced rest clientという拡張プラグインを使用します。

HTTPリクエストにはPostmanなどのツールでも問題ありません。

Method、Request URLを以下の様に編集してください。

urlのhttp://IPアドレス:8000/user/1/delete としてみましょう。

次にBodyを以下の様に編集します。

{
  "name": "test901",
  "age": 99,
  "email": "test901@sample.com",
  "user_id": 1
}

そして最後にsendボタンをクリックします。

成功したら以下の様になります。

データベースの中身も覗いてみましょう。

以下のようにレスポンスされればDELETEは完了です。

{
  "name": "test901",
  "age": 99,
  "email": "test901@sample.com",
  "user_id": 1
}

では実際にデータ更新されたか確認してみます。

postgreユーザにスイッチして、usersテーブルに確認してみましょう。

su - postgres
psql -U fastapi -h 127.0.0.1 -p 5432 fastapi

データが挿入されていることを確認しましょう。

fastapi=> select * from users;
 user_id |  name   | age |       email
---------+---------+-----+--------------------
       2 | test002 |  30 | test002@sample.com
       3 | test003 |  30 | test003@sample.com
       4 | test004 |  20 | test004@sample.com

これでデータ削除(DELETE文)が正常に行われたことが確認できました。

次の記事でデータの更新(DELETE文)を実施します。

次の記事はこちら:FastAPIのAPIドキュメント自動生成

前の記事はこちらFastAPI+PostgreSQLでデータ更新。UPDATE文を実行する方法

  • システム開発、アプリ開発
  • マッチングアプリ開発
  • インフラ構築支援等、なんでもご相談ください。
よかったらシェアしてね!
  • URLをコピーしました!
目次