FastAPI 配合 PyMongo 使用 MongoDB

在现代 web 开发中,FastAPI 是一个高效、灵活且易于使用的 Python web 框架。它特别适合用于构建在 RESTful API 上的应用程序。同时,MongoDB 是一种流行的 NoSQL 数据库,它以灵活的数据模型而著称。在这篇文章中,我们将了解如何在 FastAPI 中使用 PyMongo 来连接和操作 MongoDB。

1. 环境准备

1.1 安装 FastAPI 和 PyMongo

首先,你需要确保你的 Python 环境中安装了 FastAPI 和 PyMongo。你可以使用 pip 来安装这些库:

pip install fastapi pymongo uvicorn
  • fastapi: FastAPI 框架
  • pymongo: MongoDB 的官方 Python 驱动
  • uvicorn: ASGI 服务器,以运行 FastAPI 应用

1.2 启动 MongoDB

确保 MongoDB 已经在你的本地或服务器上启动。一般情况下,可以通过以下命令启动 MongoDB:

mongod

2. FastAPI 基础结构

接下来,让我们创建一个简单的 FastAPI 应用程序。该应用程序将包括基本的 CRUD(创建、读取、更新和删除)操作。

2.1 创建 FastAPI 应用

from fastapi import FastAPI, HTTPException
from pymongo import MongoClient
from pydantic import BaseModel
from bson.objectid import ObjectId

# 定义数据模型
class Item(BaseModel):
    name: str
    description: str

# 创建FastAPI应用
app = FastAPI()

# 创建 MongoDB 客户端
client = MongoClient('mongodb://localhost:27017/')
db = client["mydatabase"]
collection = db["mycollection"]

# 订单ID处理
class PyObjectId(ObjectId):
    @classmethod
    def __get_validators__(cls):
        yield cls.validate

    @classmethod
    def validate(cls, v):
        if not ObjectId.is_valid(v):
            raise ValueError("Invalid ObjectId")
        return ObjectId(v)

在上面的代码中,我们首先定义了一个 Item 数据模型,然后创建了 FastAPI 应用,并连接到 MongoDB。

2.2 CRUD 路由

接下来,我们为 CRUD 操作创建路由。

@app.post("/items/", response_model=Item)
def create_item(item: Item):
    item_dict = item.dict()
    result = collection.insert_one(item_dict)
    item_dict["_id"] = str(result.inserted_id)
    return item_dict

@app.get("/items/{item_id}", response_model=Item)
def read_item(item_id: str):
    item = collection.find_one({"_id": ObjectId(item_id)})
    if item is None:
        raise HTTPException(status_code=404, detail="Item not found")
    return item

@app.put("/items/{item_id}", response_model=Item)
def update_item(item_id: str, item: Item):
    updated_item = collection.find_one_and_update(
        {"_id": ObjectId(item_id)},
        {"$set": item.dict()},
        return_document=True
    )
    if updated_item is None:
        raise HTTPException(status_code=404, detail="Item not found")
    return updated_item

@app.delete("/items/{item_id}")
def delete_item(item_id: str):
    result = collection.delete_one({"_id": ObjectId(item_id)})
    if result.deleted_count == 0:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"detail": "Item deleted"}

2.3 路由功能简介

  • 创建项目: 使用 POST 请求可以创建新项目。
  • 读取项目: 通过 GET 请求获取特定项目。
  • 更新项目: 使用 PUT 请求更新现有项目。
  • 删除项目: 用 DELETE 请求删除项目。

3. 运行 FastAPI 应用

在终端中运行以下命令,以启动 FastAPI 应用:

uvicorn app:app --reload

确保将 app 替换为你实际 Python 文件的文件名。

4. 测试 API

你可以使用 Postman 或 curl 来测试这些 API。以下是一些示例请求:

4.1 创建项目

curl -X POST " -H "Content-Type: application/json" -d '{"name": "Item 1", "description": "This is item 1."}'

4.2 读取项目

curl -X GET "

4.3 更新项目

curl -X PUT " -H "Content-Type: application/json" -d '{"name": "Updated Item", "description": "Updated description."}'

4.4 删除项目

curl -X DELETE "

5. 概括和序列图

通过以上步骤,我们创建了一个使用 FastAPI 和 PyMongo 的简单应用。可以和 MongoDB 进行基本的 CRUD 操作。以下是一个序列图,展示了用户调用 API 的过程:

sequenceDiagram
    participant User
    participant API
    participant MongoDB

    User->>API: POST /items/
    API->>MongoDB: insert_one(item)
    MongoDB-->>API: item_id
    API-->>User: return item

    User->>API: GET /items/{item_id}
    API->>MongoDB: find_one(item_id)
    MongoDB-->>API: item
    API-->>User: return item

    User->>API: PUT /items/{item_id}
    API->>MongoDB: find_one_and_update(item_id)
    MongoDB-->>API: updated_item
    API-->>User: return updated_item

    User->>API: DELETE /items/{item_id}
    API->>MongoDB: delete_one(item_id)
    MongoDB-->>API: delete_result
    API-->>User: return confirmation

结论

通过本文的介绍,我们成功地构建了一个使用 FastAPI 和 PyMongo 来连接 MongoDB 的基本应用程序。FastAPI 的异步特性和 PyMongo 的灵活性使得我们的应用程序能够处理并发请求,还可以轻松扩展功能。你可以在此基础上继续添加更多的功能和数据验证,以便构建更复杂的应用。在未来,FastAPI 和 MongoDB 的结合将为你的项目提供无限的可能性。希望这篇文章对你有所帮助!