构建现代 web 应用程序时,管理和与数据库交互是一项基本任务。作为 NoSQL 数据库,MongoDB 提供了出色的文档存储灵活性,这使得它非常适合存储和管理非结构化数据。而 FastAPI 是构建 API 的最快 Python 框架之一。本文档将指导您如何将 MongoDB 无缝集成到 FastAPI 应用程序中,并实现基本的 CRUD(创建、读取、更新、删除)操作,从而使测试和数据库交互更加方便。
要学习的内容- 使用 FastAPI 设置 MongoDB。
- 使用
motor,一个异步 MongoDB 驱动程序,与 FastAPI 结合使用。 - 使用 MongoDB 创建简单的 CRUD(创建、读取、更新、删除)操作。
直接来吧!
你需要先安装以下,
以下是专家建议修改后的翻译,确保符合原文的直接和口语化风格,同时改善了中文的常用表达方式和可读性:
你需要先安装以下项目:
- Python(最好是3.7及以上版本)
- MongoDB Atlas,(或任何MongoDB实例)
- FastAPI,和Motor
运行以下命令安装所需依赖项:
在命令行中输入:
pip install fastapi motor uvicorn python-dotenv
你需要配置MongoDB Atlas,或者运行本地的MongoDB实例。
项目框架这里有一个基本的文件夹结构供你参考:
项目文件夹/
│
├── main.py
├── mongodb.py
├── model.py
├── route.py
├── 环境变量文件(.env)
将FastAPI连接到MongoDB:
以下代码演示了如何将 MongoDB 链接到 FastAPI。
主程序文件 main.py此文件包含FastAPI的核心应用,以及MongoDB的连接设置。
import os
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from dotenv import load_dotenv
from motor.motor_asyncio import AsyncIOMotorClient
from mongodb import MongoDBBase
from route import router
load_dotenv()
app = FastAPI()
@app.on_event("startup")
async def startup_db_client():
# 请根据您的需求更新连接字符串
# 更多详情: https://www.mongodb.com/docs/manual/reference/connection-string
mongodb_client = AsyncIOMotorClient(
f"mongodb+srv://{os.getenv('DB_USERNAME')}:{os.getenv('DB_PASSWORD')}@{os.getenv('DB_CLUSTER')}.example.mongodb.net/"
)
database = mongodb_client[os.getenv("DB_DATABASE")]
MongoDBBase.set_database(database)
@app.on_event("shutdown")
async def shutdown_db_client():
# 获取数据库客户端
mongodb_client = MongoDBBase.get_database().client
mongodb_client.close()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.include_router(router)
在以下代码中:
- 我们使用
dotenv加载环境变量,以保护敏感信息(如数据库凭证)的安全。 - 我们使用
motor异步建立与 MongoDB 集群的连接。 startup事件用来初始化 MongoDB 客户端并建立连接,而shutdown事件则用来安全地关闭连接。
接下来,我们来定义 mongodb.py 文件中的 MongoDB 交互操作。
from typing import List, Dict, Any, Mapping
from fastapi import HTTPException
from bson import ObjectId
from motor.motor_asyncio import AsyncIOMotorDatabase
class MongoDBBase:
collection_name: str = ""
_database: AsyncIOMotorDatabase = None
@classmethod
def set_database(cls, database: AsyncIOMotorDatabase):
cls._database = database
@classmethod
def get_database(cls) -> AsyncIOMotorDatabase:
if cls._database is None:
raise HTTPException(status_code=500, detail="MongoDB 连接尚未建立")
return cls._database
@classmethod
def get_collection(cls):
database = cls.get_database()
try:
return database[cls.collection_name]
except Exception as e:
raise HTTPException(status_code=500, detail=f"访问集合时发生错误: {str(e)}")
@classmethod
async def create(cls, **kwargs) -> Dict[str, Any]:
collection = cls.get_collection()
result = await collection.insert_one(kwargs)
return {**kwargs, "_id": str(result.inserted_id)}
@classmethod
async def find(cls, id: str) -> Mapping[str, Any]:
collection = cls.get_collection()
result = await collection.find_one({"_id": ObjectId(id)})
if result is None:
raise HTTPException(status_code=404, detail="找不到该项目")
result["_id"] = str(result["_id"])
return result
@classmethod
async def all(cls) -> List[Dict[str, Any]]:
collection = cls.get_collection()
cursor = collection.find()
results = await cursor.to_list(length=None)
for result in results:
result["_id"] = str(result["_id"])
return results
@classmethod
async def update(cls, id: str, **kwargs) -> Mapping[str, Any]:
collection = cls.get_collection()
result = await collection.update_one({"_id": ObjectId(id)}, {"$set": kwargs})
if result.matched_count == 0:
raise HTTPException(status_code=404, detail="无法找到该项目")
return await cls.find(id)
@classmethod
async def delete(cls, id: str) -> Dict[str, bool]:
collection = cls.get_collection()
result = await collection.delete_one({"_id": ObjectId(id)})
if result.deleted_count == 0:
raise HTTPException(status_code=404, detail="无法找到该项目")
return {"success": True}
此文件处理与MongoDB集合之间的交互,并包含基本的 CRUD 操作(即创建(Create)、读取(Read)、更新(Update)和删除(Delete))。
模型文件 model.py现在我们来定义一下 User 模型(在 model.py 文件中):
from mongodb import MongoDBBase
# 用户类,表示用户数据集合名为"users"
class User(MongoDBBase):
collection_name = "users"
此模型继承自 MongoDBBase 类,并将 collection_name 设置为 "users"。它提供了对 MongoDB 中 users 集合的访问,并能执行用户的增删改查(CRUD)操作。
为了与 用户 模型进行互动,在 route.py 文件中添加以下代码。
从 typing 导入 Dict, Any
从 fastapi 导入 APIRouter
从 model 导入 User 作为 UserModel
router = APIRouter()
@router.get("/users", response_model=Dict[str, Any])
async def index():
user = await UserModel.all()
return {
"data": user,
}
在这个部分里:
-
index函数使用User模型的all()方法从 MongoDB 集合中获取所有用户文档。 -
返回一个包含用户列表的 JSON 响应。
- 要查看结果,请访问: http://127.0.0.1:8000/user
在项目的根目录下创建一个名为.env的文件,并在其中添加您的MongoDB凭证(如用户名和密码)。
DB_USERNAME=你的MongoDB用户名称
DB_PASSWORD=你的MongoDB密码名
DB_CLUSTER=你的MongoDB集群名
DB_DATABASE=你的数据库名称
以下结论:
到目前为止,你应该已经为将MongoDB与FastAPI集成设置了一个可以工作的环境。我们已经讲解了如何设置MongoDB连接、异步处理CRUD操作、创建模型以及定义路由。FastAPI和MongoDB结合可以构建现代、可扩展的API,是构建Python应用的强大组合。
关注我的社交媒体Github: https://github.com/chethana101 (GitHub主页)
LinkedIn: https://www.linkedin.com/in/chethana-perera (领英主页链接)
你可以在这里找到我的GitHub主页和领英主页。
共同學(xué)習(xí),寫(xiě)下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章
100積分直接送
付費(fèi)專(zhuān)欄免費(fèi)學(xué)
大額優(yōu)惠券免費(fèi)領(lǐng)
