Python | FastAPIでAPI作成 ~その7:PUTでデータ更新

Python | FastAPIでAPI作成 ~その7:PUTでデータ更新

前回の続きです。今まではデータを扱う上での基本となる「検索(GET)」「登録(POST)」「削除(DELETE)」を学びました。

今回は「更新(PUT)」です。

PUTを使ってデータを更新する

M003のClassを「B→E」に更新したいと思います。

プログラム

前回作成したプログラムを改造しています。

@app.put(“/Users/{u_id}”)の追加

今回は{u_id}で指定したIDのClassを更新します。

・global df  でグローバル変数を宣言

・df.lo/c[df[df[“ID”]==u_id].index, “Class”] = user.Class

 → df.locで特定のカラムのみ更新します。

・df = df

 → ローカル変数の値をグローバル変数に代入します。

・return df.to_json(orient=’records’)

 →更新結果を返します。

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} :ユーザの削除
# PUT /Users/ :ユーザの更新

#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 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):
    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')


#curl -X PUT -H "accept: application/json" -H "Content-Type: application/json" -d "{\"ID\":\"\", \"Name\":\"\", \"Class\":\"E\"}" http://localhost:8000/Users/M003 
@app.put("/Users/{u_id}")
async def users(u_id:str, user: Item):
    global df
    df.loc[df[df["ID"]==u_id].index, "Class"]  = user.Class
    df = df
    return  df.to_json(orient='records')

結果

では最後に結果を確認します。

/Users/ で全件取得

curlで更新を掛ける

以下をコマンドプロンプトから実行します。

curl -X PUT -H “accept: application/json” -H “Content-Type: application/json” -d “{\”ID\”:\”\”, \”Name\”:\”\”, \”Class\”:\”E\”}” http://localhost:8000/Users/M003

確かに 対象のユーザ「M003」のClassが「E」に変わっていることが分かります。

以上です!