FastAPI使用异步motor实现对mongodb的增删改查

一、环境准备:

需要有mongodbpoetry以及Python3.10+

二、克隆示例代码到本地

bash 复制代码
git clone git@github.com:waketzheng/fastapi_async_mongo_demo.git

三、安装依赖

bash 复制代码
cd fastapi_async_mongo_demo
poetry shell
poetry install

四、启动服务

bash 复制代码
python app/main.py

五、访问本地文档

http://localhost:8000/docs

六、代码详解:

目录如下:

python 复制代码
.
├── app
│   ├── db.py
│   ├── main.py
│   ├── schemas
│   │   ├── __init__.py
│   │   ├── item.py
│   │   └── user.py
│   ├── utils.py
│   └── views.py
├── poetry.lock
├── pyproject.toml
└── README.md
  1. 数据库连接(app/db.py)
python 复制代码
from pathlib import Path
from typing import TYPE_CHECKING

import motor.motor_asyncio

if TYPE_CHECKING:
    from motor.core import AgnosticClient

client: "AgnosticClient" = motor.motor_asyncio.AsyncIOMotorClient("localhost", 27017)
db_name = Path(__file__).parent.parent.name.replace("-", "_")
database = client[db_name]
github/fastapi_async_mongo_demo [main●] >> vi app/db.py
github/fastapi_async_mongo_demo [main●] >> cat app/db.py
from pathlib import Path
from typing import TYPE_CHECKING

import motor.motor_asyncio

if TYPE_CHECKING:
    from motor.core import AgnosticClient

client: "AgnosticClient" = motor.motor_asyncio.AsyncIOMotorClient("localhost", 27017)
db_name: str = Path(__file__).parent.parent.name.replace("-", "_")
database = client[db_name]
  1. 启动服务器时,挂载数据库连接实例(app/main.py)
python 复制代码
from contextlib import asynccontextmanager
from fastapi import FastAPI
from db import database

@asynccontextmanager
async def lifespan(app: FastAPI):
    app.state.db = database
    yield


app = FastAPI(lifespan=lifespan)
  1. 根据用户传入的id,查询数据库,返回json格式的数据给用户
python 复制代码
from bson.objectid import ObjectId
from fastapi import Request


@app.get("/items/{id}")
async def item_data(request: Request, id: str) -> dict:
    collection = request.app.state.db['item']
    obj = await collection.find_one({"_id": ObjectId(id)})
    data = {'id': str(obj['_id']), 'name': obj['name']} 
    return data
  1. 增删改
python 复制代码
# 增
data = {'name': 'xx', 'description': None}
inserted = await collection.insert_one(data)
object_id: str = str(inserted.inserted_id)

# 改
data = {'name': 'new_name'}
await collection.update_one({"_id": ObjectId(id)}, {"$set": data})

# 删
await collection.delete_one({"_id": ObjectId(id)})

# 查询所有记录
objs = []
async for obj in self.collection.find():
    objs.append(obj)
相关推荐
寒山李白25 分钟前
IDEA连接MySQL服务器数据库指南
java·数据库·mysql·intellij-idea·idea·database
亿坊电商3 小时前
PHP后端项目中多环境配置管理:开发、测试、生产的优雅解决方案!
服务器·数据库·php
韩立学长3 小时前
基于Springboot的影视评论网站的设计与实现58py6238(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
未来之窗软件服务4 小时前
未来之窗昭和仙君(四十七)开发商品进销存——东方仙盟筑基期
数据库·进销存·仙盟创梦ide·东方仙盟·昭和仙君·东方仙盟架构
IDOlaoluo5 小时前
TinyRDM 1.2.3 Windows版安装教程(附Redis客户端下载及详细步骤)
数据库·redis·缓存
小光学长5 小时前
基于微信小程序的背单词系统x1o5sz72(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·微信小程序·小程序
我命由我123456 小时前
Derby - Derby 服务器(Derby 概述、Derby 服务器下载与启动、Derby 连接数据库与创建数据表、Derby 数据库操作)
java·运维·服务器·数据库·后端·java-ee·后端框架
RestCloud8 小时前
达梦数据库到Greenplum:用ETL工具实现数据仓库迁移
数据库·数据仓库·etl·达梦数据库·数据传输·greenplum
Boilermaker19929 小时前
【Redis】集群与分布式缓存
java·数据库·redis·1024程序员节
武子康9 小时前
Java-163 MongoDB 生产安全加固实战:10 分钟完成认证、最小权限、角色详解
java·数据库·分布式·mongodb·性能优化·系统架构·nosql