fastapi全局注入mysql,单数据库

1、封装sql连接
test_db.py

from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker
from fastapi import Request, Depends# 1. 数据库连接配置
async_engine = create_async_engine("mysql+aiomysql://root:root@127.0.0.1:3306/dade?charset=utf8mb4",pool_size=30, # 数据库连接池max_overflow=60, # 连接池最大溢出连接数pool_recycle=3600, # 设置时间以限制数据库自动断开pool_timeout=60, # 连接超时时间,默认30秒,超过时间连接都会失败pool_pre_ping=True, # 连接有效性校验,在从连接池获取连接前,自动发送一个 “心跳检测”(如 SELECT 1),校验连接是否有效(避免使用 “已断开的死连接”)。
)# 2. 异步会话工厂,class_=AsyncSession,# 指定异步会话类
AsyncSessionLocal = sessionmaker(bind=async_engine,class_=AsyncSession,autocommit=False,autoflush=False)# 3. 全局数据库依赖(负责初始化会话到 Request.state)
async def get_db(request: Request):if not hasattr(request.state, "db"):request.state.db = AsyncSessionLocal()  # 初始化会话并存入请求状态try:yield request.state.dbfinally:# 请求结束后关闭会话,避免资源泄漏if hasattr(request.state, "db"):await request.state.db.close()del request.state.db# 4. 从外部传入的 Request 中提取会话
async def get_current_db(request: Request):"""直接从路由的 Request 对象中获取数据库会话"""# 验证会话是否已被全局依赖初始化if not hasattr(request.state, "db"):raise RuntimeError("数据库会话未初始化!请检查 main.py 是否配置了全局依赖 get_db")return request.state.db

2、main.py文件

import sys
from pathlib import Path# 1. 注入项目根目录到 Python 搜索路径,获取当前文件(user/main.py)的根目录(dome001)
root_dir = Path(__file__).resolve().parent.parent
sys.path.append(str(root_dir))from dotenv import load_dotenv
load_dotenv(dotenv_path=root_dir / ".env")
# 获取.env中的参数
import os
db_host = os.getenv("DADE")from fastapi import FastAPI,Depends
from starlette.staticfiles import StaticFiles
from demo.common.test_db import get_db# 微服务http请求
from common_http.background_user import *
print(http_user_dade("dadae微服务"))#dependencies全局注入数据库
app = FastAPI(dependencies=[Depends(get_db)])# 静态文件
current_dir = Path(__file__).parent  # __file__ 是当前脚本的路径,.parent 是其所在目录(app/)
static_dir = current_dir.parent / "static"  # 上级目录(cashier_v5/) + static 文件夹
# 检查并创建(如果不存在)
if not static_dir.exists():static_dir.mkdir(parents=True, exist_ok=True)  # parents=True 表示递归创建上级目录,exist_ok=True 表示目录已存在时不报错print(f"已自动创建静态文件目录:{static_dir.resolve()}")
else:print(f"静态文件目录已存在:{static_dir.resolve()}")
app.mount("/static", StaticFiles(directory=static_dir), name="static")from urls import global_router
app.include_router(global_router)
@app.get("/",tags=["服务健康检测"])
async def root():return {"message": "欢迎demo服务"}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=9000)

主要

from fastapi import FastAPI,Depends
from starlette.staticfiles import StaticFiles
from demo.common.test_db import get_db
#dependencies全局注入数据库
app = FastAPI(dependencies=[Depends(get_db)])

3、全局可以这样使用,通过 request.state.db

@index_routes.post("/req_data",summary="请求体传参,文档",description="这是一个示例接口",response_model=ReqDataSerializer)
async def req_data(request: Request,req: ReqDataSerializer):# 1. 传入路由的 request 对象,获取数据库会话db = await get_current_db(request)# 2. 执行数据库操作(示例:查询 users 表)sql = text("select * from users limit 1")result = await db.execute(sql)user = result.mappings().first()  # 转为字典格式print("查询到的用户数据:", user)return req

在这里插入图片描述

4、可直接在main.py封装个方法

# 创建工具函数:从请求对象中直接获取db会话
async def get_current_db(request: Request) -> AsyncSession:"""从请求对象中提取已注入的数据库会话"""return request.state.db

在任何路由函数中,直接调用 await get_current_db(Request) 即可获取数据库会话,例如:

@app.get("/products/")
async def read_products():db = await get_current_db(Request)# 执行查询:products = await db.query(Product).all()return {"message": "产品数据查询成功"}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习常见应用算力要求?

深度学习常见应用的算力要求,首先需要明确算力的核心衡量维度:计算能力:以每秒浮点运算次数(FLOPS,如 TF32/FP16/FP8 精度下的吞吐量)衡量,决定任务运行速度;显存容量:决…

邪修实战系列(5)

1、第一阶段邪修实战总览(9.1-9.30) 把第一阶段(基础夯实期)的学习计划拆解成极具操作性的每日行动方案。这个计划充分利用我“在职学习”的特殊优势,强调“用输出倒逼输入”,确保每一分钟的学习都直接服务…

Python TensorFlow的CNN-LSTM-GRU集成模型在边缘物联网数据IoT电动汽车充电站入侵检测应用

全文链接:https://tecdat.cn/?p43881 原文出处:拓端抖音号拓端tecdat 随着物联网(IoT)技术在电动汽车充电站(EVCS)中的普及,充电站不仅成为智能交通的关键节点,更因连接电网、用户设…

3dma渲染噪点成因排查及优化方案

有时候在用 3D Max 渲染完效果图,画面上总有密密麻麻的小颗粒,也就是常说的噪点,原本精致的模型和材质,一有噪点质感就掉了大半。其实多数时候,噪点问题都和渲染参数设置有关。那么出现噪点原因和解决方案有哪些&#…

【LeetCode】算法详解#15 ---环形链表II

1.题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评…

Kafka面试精讲 Day 18:磁盘IO与网络优化

【Kafka面试精讲 Day 18】磁盘IO与网络优化 在“Kafka面试精讲”系列的第18天,我们聚焦于磁盘IO与网络优化。作为支撑百万级吞吐量的分布式消息系统,Kafka的高性能不仅依赖于优秀的架构设计,更离不开对底层资源——尤其是磁盘和网络——的极…

ActiveMQ RocketMQ RabbitMQ Kafka选型及应用场景

许多时候我们都将Kafka拿来跟常用的几个消息队列作比较,将 Kafka 加入对比使得选型更加全面和实际。但请注意Kafka并非完全适用消息中间件的所有场景。这四款消息中间件定位不同,选择取决于你的具体场景。消息队列选型核心定位一句话总结RabbitMQ&#x…

STM32初始化串口重定向后printf调试信息不输出的问题

STM32初始化串口重定向后调试信息不输出的问题 Author:明月清了个风Date: 2025/9/9PS:开发stm32F745的过程中发现printf有时候不打印信息,单独调试确定了串口初始化和重定向正确,但是在系统整体调试的时候虽然正确运行…

PCA9535ECDWR2G 微控制器MCU接口芯片 ON 电子元器件解析

一、PCA9535ECDWR2G ON 元器件解析1. 是什么电子元器件? PCA9535ECDWR2G 是安森美半导体(ON Semiconductor)生产的一款16位I/O扩展器。它属于接口芯片类别,具体功能是通过IC总线为微控制器(MCU)提供额外的通…

大模型中token与tokenizer的区别

TokenToken 的基本概念在大模型(如GPT系列)中,token是文本处理的最小单位。模型将输入的文本分割成token序列,每个token对应一个唯一的整数ID,用于模型的内部处理。例如,英文单词"apple"可能被编…

还在觉得剪辑太难?用对视频剪辑软件,让剪辑变得像拼图一样有趣

想制作出精彩的Vlog,拥有一款简单易用的视频编辑软件是关键的第一步。如果你曾因为觉得剪辑太复杂、技术门槛太高而望而却步,那么这篇文章就是为你准备的,因为借助今天简单易用的视频编辑软件,人人都能成为自己生活的导演。本文就…

【ZEGO即构开发者日报】微信公众号上线“智能回复”功能;2025年8月中国应用/游戏厂商出海收入Top30榜;土耳其宣布将封禁29款社交/社媒应用……

💡开发者朋友们大家好,这里是 开发者日报!欢迎查阅您的实时互动日报。本栏目实时聚焦、每日更新【AI】、【泛娱乐】、【语音交互】、【实时音视频】等领域热点,欢迎大家在评论区一起探讨! 🔨「产品技术」 …

前端WebSocket实时通信实现

在项目中使用WebSocket实现实时通信 WebSocket提供了一种在客户端和服务器之间建立持久连接的方式,可以实现实时数据交换。下面我将展示如何在前端项目中集成WebSocket功能。 设计思路 我将创建一个简单的聊天室界面来演示WebSocket的使用,包含以下功能&…

电磁流量计可靠品牌之选,基恩士提供多样化解决方案

引言在工业自动化领域,流量的精确计量是保障产品质量、优化成本和提升设备效率的关键一环。当面临“电磁流量计的可靠品牌”这一问题时,企业通常需要考量产品的耐用性、测量精度、维护成本以及系统集成能力。流量计在安装、维护和测量精度方面面临诸多挑…

NumPy数组与Python列表的赋值行为解析

在Python科学计算中,NumPy数组和Python原生列表是两种常用的数据结构。理解它们之间的赋值行为差异对于编写高效、正确的代码至关重要。本文将深入探讨NumPy数组赋值给Python变量的各种情况,揭示背后的内存机制和类型转换特性。 直接赋值行为分析 当我们…

中国制造难点在哪里?

最近生产一批板子,其中一个进口的连接器为什么能卖我们差不多一千多钱还没现货,有时候还禁售;规格书也就寥寥一页而已,外观看起来也淡淡无奇,身为制造业强国的我们为什么没人做呢?你们怎么看?#中…

python 读取大文件优化示例

核心方法逐行读取 - 最常用,内存占用O(1)分块读取 - 适合超大文件,可控制内存使用内存映射 - 高性能,虚拟内存映射缓冲读取 - 平衡性能和内存特殊场景处理CSV文件 - 使用pandas的chunksize参数JSON Lines - 逐行解析JSON对象文本分析 - 内存高…

VBA数据结构深度解析:字典对象与集合对象的性能终极对决

VBA数据结构大揭秘:Dictionary与Collection,谁才是性能王者? 某头部券商的风控系统曾遭遇"数据黑洞"危机:使用Collection处理10万条交易记录时,系统响应时间长达47秒,而改用Dictionary后仅需3.2秒——效率差距达14.7倍!这背后是VBA开发者普遍存在的认知盲区:…

【系统分析师】2025年上半年真题:论文及解题思路

更多内容请见: 备考系统分析师-专栏介绍和目录 文章目录 试题一:论信息系统运维管理技术与应用 试题二:论软件系统测试方法及应用 试题三:论信息系统开发方法及应用 试题四:论模型驱动分析方法及应用 试题一:论信息系统运维管理技术与应用 智能运维(AIOps)是以人工智能…

立创·庐山派K230CanMV开发板的进阶学习——颜色识别

学习目标:立创庐山派K230CanMV开发板的进阶学习——颜色识别学习内容:颜色识别 颜色识别 1. 本节介绍 📝 学习内容:本节将学习基于颜色阈值的色块检测技术,通过定义特定颜色范围,从摄像头采集的图像中识别并…