FastAPIとMongoDB · 4 min read · Sep 09, 2025
Ubuntu 24.04にMongoDBとFastAPIをインストールする方法

FastAPIは、APIサービスを作成するためのPythonに基づくWebフレームワークです。これは、非同期操作をサポートする現代的で高速な高性能フレームワークです。
このチュートリアルでは、Ubuntu 24.04にMongoDBとFastAPIをインストールする方法を学びます。また、FastAPIとMongoDBデータベースを使用してCRUD操作を持つ最初のAPIを作成する方法も学びます。
前提条件
このガイドを始める前に、以下のものを用意してください:
- Ubuntu 24.04システム
- 管理者権限を持つ非ルートユーザー
MongoDBのインストール
新しいFastAPIプロジェクトを作成する前に、システムにMongoDBサーバーをインストールしましょう。
まず、以下のコマンドを実行してパッケージインデックスを更新し、システムに「gnupg」と「curl」をインストールします。
sudo apt update && sudo apt install gnupg curl -y次に、以下のコマンドを実行してMongoDBサーバーのGPGキーを追加します。
curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
--dearmor以下のコマンドを使用してMongoDBリポジトリを追加します。
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.listリポジトリが追加されたら、次のコマンドを実行してパッケージインデックスを更新し、MongoDBサーバーをインストールします。インストールを確認するために「Y」と入力します。
sudo apt update && sudo apt install mongodb-orgインストールが完了したら、MongoDBサービス「mongod」を開始して有効にし、MongoDBサービスの状態を確認して実行中であることを確認します。
sudo systemctl enable --now mongod
sudo systemctl status mongod以下のようにMongoDBサーバーが実行中であることが確認できます。

さらに、以下の「mongosh」コマンドを使用してMongoDBサーバーにログインできます。終了するには、Ctrl+dを押します。
mongoshPythonと仮想環境の設定
MongoDBがインストールされたので、Pythonパッケージをインストールし、プロジェクトディレクトリと仮想環境を設定します。
以下のコマンドでPython、Pip、およびVenvモジュールをインストールします。インストールを確認するために「Y」と入力します。
sudo apt install python3 python3-pip python3-venv
インストールが完了したら、ユーザーにログインします。
su - username新しい「 ~/app 」ディレクトリを作成し、その中に移動します。このディレクトリはFastAPIプロジェクトを保存するために使用されます。
mkdir -p ~/app; cd ~/app以下のコマンドを実行して新しい「 venv 」仮想環境を作成し、アクティブにします。これにより、シェルプロンプトが「 (venv) user@hostname 」のようになります。
python3 -m venv .venv
source .venv/bin/activate
ここからは、作業環境が「venv」仮想環境である必要があります。「venv」からログアウトするには、以下のコマンドを使用します。
deactivateFastAPIプロジェクトの作成
Python仮想環境を作成してアクティブにしたので、FastAPIをインストールし、プロジェクト構造を作成しましょう。
「pip3」コマンドを使用して「fastapi」と「uvicorn」パッケージをインストールします。
pip3 install fastapi uvicorn- 「fastapi」は、PythonでAPIを構築するための主要なFastAPI Webフレームワークです。
- 「uvicorn」は、PythonでのASGI(非同期サーバーゲートウェイインターフェース)Webサーバーの実装です。
インストールが完了したら、以下のコマンドで新しいファイルとディレクトリを作成します。
mkdir -p server/{models,routes}
touch main.py server/{app.py,database.py} server/models/itemModels.py server/routes/item.py以下が私たちのFastAPIプロジェクトの構造です。

server/app.py
プロジェクトが準備できたので、FastAPIプロジェクトのメインアプリケーションである「server/app.py」ファイルを修正しましょう。
テキストエディタで「 app.py 」ファイルを開き、以下のスクリプトをコピーします。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello FastAPI!"}- FastAPIモジュールをプロジェクトにインポートし、「app」変数にバインドします。
- 「Hello FastAPI!」を返す新しい「root」関数を作成します。
- 「root」関数は、ルートURLのGETメソッドに応答します。
- 「async」は、関数を非同期関数としてマークし、呼び出されたときにその本体内で「await」を使用する可能性があります。
main.py
このセクションでは、FastAPIプロジェクトを「uvicorn」(PythonのASGI Webサーバー)を介して実行するために使用される「main.py」ファイルを修正します。
「 main.py 」スクリプトを開いて修正し、以下のコードを挿入します。
import uvicorn
if __name__ == "__main__":
uvicorn.run("server.app:app", host="0.0.0.0", port=8080, reload=True)- 「uvicorn」モジュールをインポートします。
- 「main.py」スクリプトが実行されると、「server/app.py」内の「app」またはFastAPIモジュールが読み込まれます。
- FastAPIは「0.0.0.0」でポート「8080」で実行されます。
- コードが変更されたときに自動リロードを有効にします(「reload=True」)。
FastAPIプロジェクトを実行する
プロジェクトが準備できたので、最初のFastAPIプロジェクトを実行しましょう。
以下のように「main.py」スクリプトを実行すると、FastAPIがシステムで実行されます。
python3 main.py
今、ウェブブラウザを開いてhttp://SERVERIP:8080/にアクセスします。インストールが成功していれば、「Hello FastAPI!」メッセージが表示されます。また、ターミナルから「curl」を介してもアクセスできます。
最後に、Swagger UIによって提供されるAPIドキュメントにhttp://SERVERIP:8080/docsでアクセスできます。

FastAPIをMongoDBに接続する
このガイドでは、FastAPIとMongoDBを使用して基本的なAPIを作成します。APIはMongoDBデータベースサーバーとCRUD操作ができる必要があります。このステップでは、プロジェクトをMongoDBサーバーに接続します。
まず、以下の「pip3」コマンドを実行してプロジェクトに「 motor 」MongoDBドライバーをインストールします。「motor」は、MongoDBサーバーへのノンブロッキングおよびコルーチンベースのAPIアクセスを提供します。
pip3 install motorserver/database.py
「 motor 」モジュールがインストールされたら、「 server/database.py 」スクリプトを修正しましょう。
テキストエディタで「server/database.py」ファイルを開き、以下のスクリプトを入力します。これは「motor」モジュールを介してMongoDBサーバーに接続するために使用されます。
from motor.motor_asyncio import AsyncIOMotorClient
MONGODB_HOST = "mongodb://localhost:27017"
connection = AsyncIOMotorClient(MONGODB_HOST)
database = connection.items
item_collection = database.get_collection("item_collection")- 「motor.motor_asyncio」から「AsyncIOMotorClient」をインポートします。
- 新しい定数「MONGODB_HOST」を作成し、MongoDBサーバー「mongodb://localhost:27017」を指します。
- 「connection」変数を介してMongoDBサーバーに接続します。
- 「database」変数を介して「items」データベースに接続します。
- 「item_collection」変数を使用してデータベースのコレクションにアクセスします。
pydanticを使用したデータベースモデルの作成
このセクションでは、「 pydantic 」を介してデータを設計します。これはMongoDBデータベースのモデリングを提供します。
以下の「pip3」コマンドで「pydantic」モジュールをインストールします。「 pydantic 」モジュールは、モデルを介してデータベーススキーマを作成するためのデータ検証ライブラリです。
pip3 install pydantic今、「 server/models/itemModels.py 」ファイルをテキストエディタで開き、以下のスクリプトをコピーします。
from pydantic import BaseModel, Field
from typing import Optional
class Item(BaseModel):
name: str
category: str
stocks: int
price: int = Field(gt=0)
class Config:
json_schema_extra = {
"example": {
"name": "Company Smart Watch",
"category": "smartwatch",
"stocks": 10,
"price": 1000,
}
}
class ItemUpdate(BaseModel):
name: Optional[str] = None
category: Optional[str] = None
stocks: Optional[int] = None
price: Optional[int] = None
class Config:
json_schema_extra = {
"example": {
"name": "New Smart watch",
"category": "new-smartwatch",
"stocks": 5,
"price": 500,
}
}- 「pydantic」から「BaseModel」と「Field」モジュールをインポートします。
- 「typing」から「Optional」モジュールをインポートします。
- FastAPI用の「Item」データベーススキーマを作成します:- 「name」と「category」は文字列型
- 「stocks」と「price」は整数型
- 「price」は0より大きくなければなりません。
- 「Config」クラスを介してデータモデルを拡張し、ユーザーがリクエストに含めることができるデータの例を提供します。
- すべてのフィールドがオプションの「ItemUpdate」スキーマを作成します。
CRUD操作の追加
この時点で、MongoDBサーバーへの接続を作成し、「pydantic」を介してデータベーススキーマを作成しました。次に、FastAPIとMongoDBを使用してCRUD操作を作成します。
再度「 server/database.py 」スクリプトを開き、「 item_helper 」というタイプ「 dict 」の新しい関数を作成します。この関数を呼び出してアイテムの詳細データを取得します。
def item_helper(item) -> dict:
return {
"id": str(item["_id"]),
"name": item["name"],
"category": item["category"],
"stocks": item["stocks"],
"price": item["price"],
}以下の行を追加して「 ObjectId 」モジュールを「bson.objectid」からインポートします。「 ObjectId 」は、MongoDBがデータを保存およびJSONデータを表現するために使用するBSONのデータ型の一部です。
from bson.objectid import ObjectIdアイテムの作成
まず、新しいデータをMongoDBデータベースに追加できる非同期関数を作成します。
以下のように「 add_item 」という新しい関数を作成します。
# 新しいアイテムを追加
async def add_item(item_details: dict) -> dict :
item = await item_collection.insert_one(item_details)
new_item = await item_collection.find_one({"_id": item.inserted_id})
return item_helper(new_item)- 「add_item」関数は、アイテムの詳細を含む辞書データを受け取ります。
- 「item_collection」を介してデータベース内のドキュメントにアクセスし、「insert_one」クエリを実行して新しいアイテムを追加します。
- 新しいアイテムは、操作が成功した場合に印刷されます。
すべてのアイテムを取得
次に、「get_items」という新しい関数を作成し、データベース内のすべての利用可能なアイテムを取得できるようにします。
MongoDBからすべてのアイテムを取得するための「 get_items 」という新しい関数を作成します。
# すべてのアイテムを取得
async def get_items():
items = []
async for item in item_collection.find():
items.append(item_helper(item))
return items- 「items」の空のリストを作成します。
- 「find()」クエリを使用してすべてのデータを検索し、それをループします。
- 各アイテムは「append」メソッドを介して「items」リストに追加されます。
- ループが完了すると、アイテムが表示されます。
idに基づく特定のアイテムを取得
次に、特定のセレクター「id」のデータを取得できる新しい関数を作成します。これにより、特定のアイテムの詳細データが表示されます。
特定のアイテムのデータを取得するための「 get_item 」関数を作成します。この「get_item」関数は、セレクターとして「id」の文字列を受け取り、辞書を返します。
# 特定のアイテムを取得
async def get_item(id: str) -> dict:
item = await item_collection.find_one({"_id": ObjectId(id)})
if item:
return item_helper(item)
return "アイテムが見つかりません。"- 「find_one()」クエリを使用して「id」に基づいてデータを取得します。
- アイテムが見つかった場合、詳細は「item_helper」辞書形式で表示されます。
- アイテムが利用できない場合、応答は「アイテムが見つかりません。」です。
アイテムの更新
次に、アイテムを更新するための新しい関数を作成します。APIを介してアイテムを部分的に更新することもできます。
以下のコードのように「 change_item 」という新しい関数を定義します。
# アイテムを更新
async def change_item(id: str, data: dict):
if len(data) < 1:
return "データを入力してください"
find_item = await item_collection.find_one({"_id": ObjectId(id)})
if find_item:
item_update = await item_collection.update_one({"_id": ObjectId(id)}, {"$set": data})
if item_update:
return True
return False- 「change_item」関数は、ターゲットアイテムの「id」と新しいデータとして「data」の2つの引数を受け取ります。
- データが空または「< 1」の場合、操作は終了します。
- この関数は「id」セレクターに基づいてアイテムを見つけます。
- 「id」が見つかった場合、「item_update」が実行されます。
- 「item_update」が成功した場合は「True」を返し、そうでない場合は「False」を返します。
アイテムの削除
最後に、特定のセレクターを介してアイテムを削除するための「delete_item」関数を作成します。
アイテムを削除するには、「 delete_item 」関数を作成し、「id」セレクターを使用します。
# アイテムを削除
async def delete_item(id: str):
item = await item_collection.find_one({"_id": ObjectId(id)})
if item:
await item_collection.delete_one({"_id": ObjectId(id)})
return(f'アイテム {id} が削除されました。')
return "アイテムが見つかりません。"- 「find_one()」クエリは、提供された「id」に基づいてアイテムを検索します。
- アイテムが見つかった場合、「delete_one()」クエリを介して削除され、「アイテムidが削除されました」と表示されます。
- アイテムが利用できない場合、「アイテムが見つかりません。」が表示されます。
CRUD操作のためのルートの追加
この時点で、FastAPIを使用してCRUD操作のための非同期関数を作成しました。次に、各操作のルートまたはエンドポイントを作成します。
「 server/routes/item.py 」ファイルを好みのエディタで編集します。
server/routes/item.py
まず、「fastapi」から「 APIRouter 」と「 Body 」モジュールを追加します。次に、「fastapi.encoders」から「 jsonable_encode 」を追加します。
from fastapi import APIRouter, Body
from fastapi.encoders import jsonable_encoder「database.py」ファイルから各関数をインポートします。
from server.database import (
add_item,
get_items,
get_item,
change_item,
delete_item,
)「itemModels.py」ファイルから「Item」と「ItemUpdate」モデルをインポートします。
from server.models.itemModels import (
Item,
ItemUpdate,
)「router」変数を介して「APIRouter」クラスを呼び出します。
router = APIRouter()新しいアイテムを追加するためのルート
新しいアイテムを追加するためのルートを追加しましょう。この例では、「 /item 」URLにPOSTを介して新しいアイテムを追加できます。
以下の行を追加して新しいアイテムを追加するためのルートを設定します。アイテムのルートURLへのすべてのPOSTは、新しいデータの挿入として扱われます。
# 新しいアイテム操作を追加
@router.post("/")
async def add_item_data(item: Item = Body(...)):
item = jsonable_encoder(item)
new_item = await add_item(item)
return new_item- 「add_item_data」関数は、「Body」の一部として「Item」スキーマを受け取ります。
- アイテムは「jsonable_encoder」を介して辞書形式に変換されます。
- 辞書データを「add_item」関数(database.py参照)を介して「new_item」変数に挿入します。
- 挿入されたデータ「new_item」を応答として返します。
すべてのアイテムを取得するためのルート
データを取得するためのルートを設定するために、以下のスクリプトを追加します。アイテムのルートURLへのすべてのGETリクエストは、すべてのデータを取得します。
# 利用可能なすべてのアイテムを取得
@router.get("/")
async def get_item_data():
items = await get_items()
if items:
return items
return "利用可能なアイテムはありません。"- 「get_item_data」関数を作成し、「database.py」ファイルから「get_item」関数を実行します。
- アイテムが利用可能な場合、すべてのアイテムのリストが取得されます。
- アイテムがない場合、「利用可能なアイテムはありません。」という応答が得られます。
特定のアイテムを取得するためのルート
特定のアイテムの詳細を取得するために、「id」をセレクターとして使用します。すべてのGETリクエストは、要求された「id」の詳細なアイテムを返します。
# idを介してアイテムの詳細を表示
@router.get("/{id}")
async def get_item_details(id):
item_details = await get_item(id)
if item_details:
return item_details
return "アイテムが見つかりません。"- 「get_item_details」関数が作成され、URLから「id」を渡します。
- 「get_item」関数(database.py参照)が呼び出され、「id」を引数として渡します。
- アイテムが見つかった場合、アイテムの詳細が表示されます。
- 特定の「id」のアイテムがない場合、「アイテムが見つかりません。」という応答が得られます。
アイテムを更新するためのルート
更新されたアイテムのルートを設定するために、以下のコードをコピーします。
# アイテムを更新
@router.put("/{id}")
async def update_item(id: str, data: ItemUpdate = Body(...)):
data = {k: v for k, v in data.dict().items() if v is not None}
updated_item = await change_item(id, data)
if updated_item:
return{f'成功: アイテム {id} が更新されました。'}
return "エラー"- 「update_item」関数は、2つの引数「id」と「data」を受け取ります。「data」は「ItemUpdate」モデルに基づいています。
- 「data」変数内でデータがチェックされます。
- 「updated_item」は「database.py」ファイルから「change_item」関数を実行します。
- 更新が成功した場合、「成功」と表示されます。
アイテムを削除するためのルート
アイテムを削除するための「remove_item」関数を作成するために、以下の行を挿入します。特定の「/id」へのすべてのDELETE操作は、「id」と一致するアイテムを削除します。
# idを介してアイテムを削除
@router.delete("/{id}")
async def remove_item(id):
item_to_delete = await delete_item(id)
if item_to_delete:
return item_to_delete
return{f'アイテム {id} は利用できません。'}- 「remove_item」関数は「delete_item」を実行し、「id」セレクターを渡します。
- 削除操作は「item_to_delete」変数を介して保存され、実行されます。
- アイテムが利用できない場合、「アイテムidは利用できません。」という応答が得られます。
server/app.py
「server/routes/item.py」ファイルが完成したので、「server/app.py」に含めましょう。
テキストエディタで「 app.py 」ファイルを開きます。
「 server/routes/item.py 」ファイルから「router」を「 ItemRouter 」としてインポートします。
from server.routes.item import router as ItemRouterデフォルトのプレフィックス「 /item 」で「ItemRouter」を挿入します。CRUD操作は「 /item 」URLを介して処理されます。
app.include_router(ItemRouter, tags=["Item"], prefix="/item")これで、CRUDエンドポイントは以下のように利用可能になります:
- 新しいアイテムを追加:POST to ‘ /item ‘
- すべてのアイテムを取得:GET to ‘ /item ‘
- 特定のアイテムを取得:GET to ‘/item/id’。 ‘id’はMongoDBによって生成されます。
- アイテムを更新:PUT to ‘/item/id’
- アイテムを削除:DELETE to ‘/item/id’
CRUD操作のテスト
まず、FastAPIプロジェクトが実行中であることを確認するか、以下のように「main.py」スクリプトを実行します。
python3 main.pyhttp://SERVERIP:8080/docsに移動すると、作成した各ルートが表示されます。

以下は、新しいアイテムを追加する例です。

APIを介してすべての利用可能なアイテムを取得します。

「id」セレクターを介して特定のアイテムを取得します。

特定のアイテムから部分データを更新します。

以下は更新されたデータです。

以下は「id」セレクターを介した削除操作です。

結論
おめでとうございます!Ubuntu 24.04にMongoDBとFastAPIをインストールする作業が完了しました。また、FastAPIをMongoDBに接続する方法、’motor’モジュールを使用してデータモデルを作成する方法、FastAPIを使用してCRUD操作を作成する方法、APIのエンドポイントを作成する方法を学びました。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。