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サーバーが実行中であることが確認できます。

start enable and verify

さらに、以下の「mongosh」コマンドを使用してMongoDBサーバーにログインできます。終了するには、Ctrl+dを押します。

mongosh

Pythonと仮想環境の設定

MongoDBがインストールされたので、Pythonパッケージをインストールし、プロジェクトディレクトリと仮想環境を設定します。

以下のコマンドでPython、Pip、およびVenvモジュールをインストールします。インストールを確認するために「Y」と入力します。

sudo apt install python3 python3-pip python3-venv

install python packages

インストールが完了したら、ユーザーにログインします。

su - username

新しい「 ~/app 」ディレクトリを作成し、その中に移動します。このディレクトリはFastAPIプロジェクトを保存するために使用されます。

mkdir -p ~/app; cd ~/app

以下のコマンドを実行して新しい「 venv 」仮想環境を作成し、アクティブにします。これにより、シェルプロンプトが「 (venv) user@hostname 」のようになります。

python3 -m venv .venv  
source .venv/bin/activate

setup venv

ここからは、作業環境が「venv」仮想環境である必要があります。「venv」からログアウトするには、以下のコマンドを使用します。

deactivate

FastAPIプロジェクトの作成

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プロジェクトの構造です。

structures

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

run fastapi

今、ウェブブラウザを開いてhttp://SERVERIP:8080/にアクセスします。インストールが成功していれば、「Hello FastAPI!」メッセージが表示されます。また、ターミナルから「curl」を介してもアクセスできます。

最後に、Swagger UIによって提供されるAPIドキュメントにhttp://SERVERIP:8080/docsでアクセスできます。

fastapi docs

FastAPIをMongoDBに接続する

このガイドでは、FastAPIとMongoDBを使用して基本的なAPIを作成します。APIはMongoDBデータベースサーバーとCRUD操作ができる必要があります。このステップでは、プロジェクトをMongoDBサーバーに接続します。

まず、以下の「pip3」コマンドを実行してプロジェクトに「 motor 」MongoDBドライバーをインストールします。「motor」は、MongoDBサーバーへのノンブロッキングおよびコルーチンベースのAPIアクセスを提供します。

pip3 install motor

server/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.py

http://SERVERIP:8080/docsに移動すると、作成した各ルートが表示されます。

CRUD operations

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

add new item

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

retrieve item all

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

retrieve specific item

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

update item

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

updated data

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

delete data

結論

おめでとうございます!Ubuntu 24.04にMongoDBとFastAPIをインストールする作業が完了しました。また、FastAPIをMongoDBに接続する方法、’motor’モジュールを使用してデータモデルを作成する方法、FastAPIを使用してCRUD操作を作成する方法、APIのエンドポイントを作成する方法を学びました。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。