Fastapi使用MongoDB作为数据库

FastAPI项目中使用MongoDB做数据存储

以下代码分为两个模块实现:mongo_con.pymongo_client.py

mongo_con.py代码如下

from motor.motor_asyncio import AsyncIOMotorClientclass MongoConnection:def __init__(self, uri: str):self.uri = uri  # 数据库连接 URIself.client = None  # 初始化客户端为空async def connect(self):"""连接到 MongoDB 数据库."""self.client = AsyncIOMotorClient(self.uri)  # 创建异步客户端# 可以选择连接一个特定的数据库,假设这个数据库叫 "test_db"self.database = self.client["test_db"]async def disconnect(self):"""断开与 MongoDB 的连接."""self.client.close()  # 关闭客户端连接

mongo_client.py代码如下:

from motor.motor_asyncio import AsyncIOMotorCollectionclass MongoClient:def __init__(self, database):# 使用传入的数据库实例初始化 MongoClientself.collection: AsyncIOMotorCollection = database["your_collection_name"]  # 指定要操作的集合async def insert_one(self, document):"""向集合中插入单个文档."""result = await self.collection.insert_one(document)  # 执行插入操作return result.inserted_id  # 返回插入文档的 IDasync def insert_many(self, documents):"""向集合中插入多个文档."""result = await self.collection.insert_many(documents)  # 执行插入操作return result.inserted_ids  # 返回插入文档的 ID 列表async def find_one(self, filter):"""根据过滤条件查找单个文档."""document = await self.collection.find_one(filter)  # 执行查找操作return document  # 返回查找到的文档async def find(self, filter, limit=10, skip=0):"""根据过滤条件查找多个文档,支持分页."""cursor = self.collection.find(filter).skip(skip).limit(limit)  # 执行查找操作并添加分页documents = await cursor.to_list(length=limit)  # 将游标转换为列表return documents  # 返回查找到的文档列表async def update_one(self, filter, update):"""根据过滤条件更新单个文档."""result = await self.collection.update_one(filter, update)  # 执行更新操作return result.modified_count  # 返回修改的文档数量async def update_many(self, filter, update):"""根据过滤条件更新多个文档."""result = await self.collection.update_many(filter, update)  # 执行更新操作return result.modified_count  # 返回修改的文档数量async def delete_one(self, filter):"""根据过滤条件删除单个文档."""result = await self.collection.delete_one(filter)  # 执行删除操作return result.deleted_count  # 返回删除的文档数量async def delete_many(self, filter):"""根据过滤条件删除多个文档."""result = await self.collection.delete_many(filter)  # 执行删除操作return result.deleted_count  # 返回删除的文档数量async def paginate(self, filter, page: int, size: int):"""分页查找文档."""cursor = self.collection.find(filter).skip((page - 1) * size).limit(size)  # 添加分页参数documents = await cursor.to_list(length=size)  # 将游标转换为列表return documents  # 返回查找到的文档列表

写一个小的FastAPI项目并启动调用连接数据库

from fastapi import FastAPI, HTTPException, Body
from mongo_con import MongoConnection
from contextlib import asynccontextmanager
from pydantic import BaseModel, Fieldmongo_uri = "mongodb://localhost:27017"  # 你的 MongoDB URI@asynccontextmanager
async def lifespan(app: FastAPI):"""FastAPI 应用的生命周期管理器."""mongo_conn = MongoConnection(mongo_uri)  # 创建 MongoConnection 实例await mongo_conn.connect()  # 连接到 MongoDBapp.mongodb = mongo_conn.database  # 将数据库对象附加到 app 上yield  # 暂停在此等待请求await mongo_conn.disconnect()  # 关闭连接app = FastAPI(lifespan=lifespan)# 定义用户模型
class User(BaseModel):name: str = Field(..., example="John Doe")@app.post("/users/")
async def create_user(user: User):"""插入用户接口,接受 name 字段."""existing_user = await app.mongodb.users.find_one({"name": user.name})if existing_user:raise HTTPException(status_code=400, detail="用户已存在")# 插入新用户await app.mongodb.users.insert_one({"name": user.name})return {"message": "用户创建成功", "user": user.name}@app.get("/")
async def read_root():return {"Hello": "World"}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14611.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

《内存函数》

内存函数 1. memcpy函数 (1)介绍 这里通过memcpy的定义我们可以看这个函数包含三个参数,destination就是拷贝的目的地,source就是拷贝的源头,num就是拷贝的个数。 (2)使用 这里要包含头文件s…

不泄密的安全远程控制软件需要哪些技术

在数字化浪潮中,远程控制软件已不再是简单的辅助工具,而是成为企业运作和日常工作中不可或缺的一部分。随着远程办公模式的广泛采纳,这些软件提供了一种既安全又高效的途径来管理和访问远端系统。无论是在家办公、技术支持还是远程教育&#…

Pycharm打开终端时报错:Cannot open Local,Failed to start[powershell.exe]

问题如下: 解决办法: 修改设置中的shell path路径 英文版pycharm:file -> settings -> Tools -> Terminal -> Shell path 中文版pycharm:文件 -> 设置 -> 工具 -> 终端 -> Shell路径 将Shell路径不全 …

15分钟学 Go 第 51 天 :通用库与工具使用

第51天:通用库与工具使用 一、学习目标 类别工具/库用途命令行工具cobra构建命令行应用JSON处理gjson高效JSON解析HTTP客户端restyHTTP请求处理日期处理carbon时间日期操作配置管理viper配置文件处理 二、详细实现 让我们通过具体示例来学习这些库的使用&#x…

基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自…

VLC-QT----Linux编译并运行示例

linux:ubuntu 16.04 qt:5.13.2 总体安装步骤 下载安装,编译 下载源码仓库,下载cmake,新建一个build文件夹,cd进去,执行代码 cmake .. -DCMAKE_BUILD_TYPEDebug 遇到报错,没有qt5Coreconfig,运行 sudo apt-get install qtdeclarative5-dev进行安装 遇到报错 Could not fi…

机器学习:XGBoost模型——高效且强大的树形模型

XGBoost(Extreme Gradient Boosting,极端梯度提升树)是一种强大的梯度提升算法,在现实中被广泛用于分类和回归任务。它通过集成多个简单的基学习器(通常是决策树)来构建一个强大的预测模型。 基本原理步骤…

爬虫开发工具与环境搭建——开发工具介绍

第二章:爬虫开发工具与环境搭建 第一节 开发工具介绍 爬虫开发需要一些合适的工具和框架来高效地抓取网页数据。在这节中,我们将介绍常用的开发工具,帮助开发者快速搭建爬虫开发环境。 1. Python与爬虫框架选择 Python因其简洁、易学的语法…

python高级之面向对象编程

一、面向过程与面向对象 面向过程和面向对象都是一种编程方式,只不过再设计上有区别。 1、面向过程pop: 举例:孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃饭 8. 妈妈给孩子送学校…

通过Docker实现openGauss的快速容器化安装

容器安装 本章节主要介绍通过 Docker 安装 openGauss,方便 DevOps 用户的安装、配置和环境设置。 支持的架构和操作系统版本 x86-64 CentOS 7.6 ARM64 openEuler 20.03 LTS 配置准备 使用 buildDockerImage.sh 脚本构建 docker 镜像,buildDockerIm…

康谋分享 | 确保AD/ADAS系统的安全:避免数据泛滥的关键

为确保AD/ADAS系统的安全性,各大车企通常需要收集、处理和分析来自于摄像头、激光雷达等传感器的数据,以找出提高系统安全性和性能的方法。然而在数据收集过程中,不可避免地会出现大量无价值数据,造成数据泛滥的情况,进…

电工电子原理笔记

这一篇手记会记录我硬件开发过程中遇到的一些底层电学原理,并且结合实际场景作为“例题”(出于篇幅和保密考虑会进行部分简化)。 叠加定理 基本介绍 在线性电路中,任一支路的电流(或电压)可以看成是电路…

【赵渝强老师】MySQL InnoDB的段、区和页

MySQL的InnoDB存储引擎的逻辑存储结构和Oracle大致相同,所有数据都被逻辑地存放在一个空间中,我们称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(pa…

Python 继承笔记

知识点: 1.has a 一个类中使用了另外一种自定义类的类型 student 使用computer book 2.类型 系统类型 str,int,float,list,tuple,dic,set 自定义类型 算是自定义的类,都可以将其当成一种类型 student是一种类型 sStudent() s是Student的类型 class Stud…

Vue3 -- 项目配置之husky【企业级项目配置保姆级教程4】

引言: eslint:代码规范校验prettier:代码格式化stylelint:CSS代码校验 上述三篇文章集成配置完成代码校验工具,当时需要每次手动的去执行命令才会格式化我们的代码。。如果有人没有格式化就提交了远程仓库&#xff0…

万字长文分析函数式编程

目录 一.认识函数式编程 一、函数式编程的定义 二、函数式编程的思想 三、函数式编程的特点 四、函数式编程的应用 二.Lambda表达式 三.Stream流 3.1 创建流对象 3.2 注意事项 3.3 Stream流的中间操作 filter map distinct sorted limit skip flatMap 3.4 St…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (8) - 原生输入法

AWTK 在嵌入式平台使用内置的输入法,在移动设备上使用系统的原生输入法。在 AWTK-Android 和 AWTK-IOS 中,使用的是 SDL 封装之后的系统原生输入法。在 AWTK-HarmonyOS 中,要使用系统的原生输入法。需要实现 input_method 接口: 1…

【解决】Layout 下创建槽位后,执行 Image 同步槽位位置后表现错误的问题。

开发平台:Unity 6.0 编程语言:CSharp 编程平台:Visual Studio 2022   一、问题背景 | 开发库存系统 图1 位置同步失败问题 图2 位置正常同步效果表现 黑框 作用于 UnityEngine.UI.GridLayoutGruop,形成 4x6 布局,如…

【Jenkins实战】Windows安装服务启动失败

写此篇短文,望告诫后人。 如果你之前装过Jenkins,出于换域账号/本地帐号的原因想重新安装,你大概率会遇上一次Jenkins服务启动失败提示: Jenkins failed to start - Verify that you have sufficient privileges to start system…

免费,WPS Office教育考试专用版

WPS Office教育考试专用版,不仅满足了考试需求,更为教育信息化注入新动力。 https://pan.quark.cn/s/609ef85ae6d4