本記事はPython初学者やFastAPIを学習したいと考えているWebエンジニア向けの入門者向けの記事になります。
この記事はFastAPIとPostgreSQLでデータ削除(DELETE)するAPIを作成したいと思います。
Pythonのインストールから実施しますので安心して記事を進めてみてください。
Pythonの高速APIのFastAPIを利用するシーンが多くなってきました。
案件でも使用する機会が増えてきたのでノウハウと公開したいと思います。
すこし前ですとPythonでWebアプリを作成するのはDjango一択でした。
ですが最近ではJavaScriptのフレームワーク(特にReact)+FastAPIで開発することが増えています。
JavaScriptフレームワーク+APIの構成で優れていると感じることはネイティブアプリでもコードや環境を流用することができる点です。
性能的に遅いと言われるPythonで文字通り高速なFastAPIを学習していただければと幸いです。
- FastAPIとは?高速APIのメリット・デメリットを紹介!
- LinuxサーバーにFastAPIのインストールをする方法
- FastAPIでHello World。Pythonの爆速Webフレームワークを試してみよう!
- FastAPIでPostgreSQLに接続する方法
- FastAPI+PostgreSQLでモデル定義+Migration
- FastAPI+PostgreSQLでデータ参照。SELECT文を実行する方法
- FastAPI+PostgreSQLでデータ挿入。INSERT文を実行する方法
- FastAPI+PostgreSQLでデータ更新。UPDATE文を実行する方法
- FastAPI+PostgreSQLでデータ削除。DELETE文を実行する方法(今回の記事はここ)
- FastAPIのAPIドキュメント自動生成
- FastAPIでJWTトークン認証を実装してみよう!
ファイル構成とディレクトリ構成の確認
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文を実行する方法