Python | FastAPIでAPI作成 ~その6:DELETEでデータ削除 & Pandas活用

Python | FastAPIでAPI作成 ~その6:DELETEでデータ削除 & Pandas活用

今回は前回の続きで、DELETEオプションを検証します。

前回の記事は以下から↓

DELETEを使ってレコードを削除する

今回はレコードを削除するためのオプション「DELETE」を使います。

プログラム

前回のプログラムを改造します。

pandasを活用する

今までリスト型辞書でデータを扱っていましたが、データ分析でお世話になっている「Pandas」を使って、もう少し楽にデータ処理を作ってみたいと思います。

① import pandasの追加

pandasを利用するため記述します。

② df = pandas.json_normalize(User_list)

joson_normalize関数を用いてJsonデータをDataFrame型に変換します。

③@app.getの改造

return部分を「df.to_json(orient=’records’)」とします。

これにより、json形式で値が返ってきます。また、orient=’records’オプションも必須です。

④@app.postの改造

append部分を改造します。ignore_index=Trueとすることで、DataFrameのindexを振り直します。

また、今回グローバル変数として設定しているdfを更新するため、「global df」を記述します。

⑤@app.deleteの追加

ここが今回の要です。

DataFrameからデータを削除するため、df.drop関数を用います。

df = df.drop(df.index[df[“ID”]==u_id])

パスパラメータで渡された値と等しい行を削除するため、「df.index[df[“ID”]==u_id]」としています。

from fastapi import FastAPI
from pydantic import BaseModel
import pandas

class Item(BaseModel):
    ID: str
    Name: str
    Class: str

app = FastAPI() #インスタンスを作成

User_list =[
    {"ID":"M001","Name":"Takashi","Class":"A"},
    {"ID":"M002","Name":"Hanako","Class":"A"},
    {"ID":"M003","Name":"Hiroshi","Class":"B"},
    {"ID":"M004","Name":"Kyoko","Class":"B"},
    ]

df = pandas.json_normalize(User_list)

# Get /Users/ : 全件取得
# Get /Users/{ID} :特定のIDのみ取得
# POST /Users/ :ユーザの登録
# DELETE /Users/{ID} :ユーザの削除

#curl http://localhost:8000/Users/
@app.get("/Users/")
async def users():
    #return User_list
    return df.to_json(orient='records')


#curl http://localhost:8000/Users/{ID}
@app.get("/Users/{u_id}")
async def users(u_id:str):
    #return list(filter(lambda item : item['ID']==u_id, User_list))
    return df[df['ID']==u_id].to_json(orient='records')


#curl -X POST -H "accept: application/json" -H "Content-Type: application/json" -d "{\"ID\":\"M005\", \"Name\":\"Aya\", \"Class\":\"C\"}," http://localhost:8000/Users/ 
@app.post("/Users/")
async def users(user: Item):
    #User_list.append({"ID": user.ID,"Name":user.Name,"Class":user.Class})
    #return User_list
    global df
    df = df.append({"ID": user.ID,"Name":user.Name,"Class":user.Class}, ignore_index=True)
    return df.to_json(orient='records')


#curl -X DELETE -H "accept: application/json" http://localhost:8000/Users/M003
@app.delete("/Users/{u_id}")
async def users(u_id:str):
    global df
    df = df.drop(df.index[df["ID"]==u_id])
    return df.to_json(orient='records')

結果

では一通りの挙動を確認します。

GET /Users/

GET /Users/{ID}

POST (M006を追加)

DELETE(M003を削除)

一通りの挙動を確認する事ができました。

ではまた!