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

一、环境准备:

需要有mongodb和poetry以及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)
相关推荐
用户125758524364 分钟前
GoFrame Vue3开源后台管理系统推荐:数据库与Worker要求怎么验
数据库·后端·go
MaxHua7 分钟前
达梦 DTS 迁移 MySQL 报错 - 3236:此列列表已索引 解决方案
数据库·后端
用户8662978480088 分钟前
Oracle 迁 KingbaseES 全流程:从评估到割接,一个都不能少
数据库
用户86629784800817 分钟前
从 MySQL 迁到 KingbaseES,KDTS 这些参数不调会吃亏
数据库
库库的数据库笔记24 分钟前
金融核心交易系统的数据库国产信创改造该如何做?
大数据·数据库·分布式·mysql·oracle·金融·数据库架构
这个DBA有点耶32 分钟前
连接数没满,应用却连不上数据库——TCP backlog溢出与somaxconn的隐藏限制
数据库·mysql·代码规范
yunlaodacom35 分钟前
华为云国际站服务代理商:BMS数据库延迟突然升高?磁盘I/O、网络与CPU排查方法
网络·数据库·华为云
SelectDB技术团队37 分钟前
Apache Doris 的时间旅行与快照能力:边界、替代路径与可落地操作
数据库·apache·数据湖·apache doris·数据库选型·多模湖仓
2601_9619633839 分钟前
电子合同检索与全文搜索怎么测、怎么选:六个指标 + 五家平台对比 + 八个自测问题
数据库·后端·python·django·智能合约
zhangjw341 小时前
1-3 PostgreSQL 架构模型:实例、数据库、Schema 模式、表空间完整概念
数据库·postgresql·架构