使用dependency_injector Singleton实例化MySQLDatabase遇ValueError问题
解决dependency_injector Singleton实例化时的ValueError问题
问题原因
直接调用Containers.mysql_db()是错误的——Containers是容器类,而非已初始化的容器实例。类级别的mysql_db是Singleton Provider对象,不是可直接调用的实例构造器,这才触发了"callable Singleton is not supported by signature"的报错。
解决方案
必须先实例化容器类,让容器完成配置加载、Provider的依赖解析,再从容器实例中获取数据库单例。
修改后的完整代码
import logging from dependency_injector import providers, containers from app.repository.mysql.database import MySQLDatabase logging.basicConfig( format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO ) logger = logging.getLogger(__name__) class Containers(containers.DeclarativeContainer): config = providers.Configuration(yaml_files=["./conf/config.yaml"]) mysql_db = providers.Singleton( MySQLDatabase, db_host=config.properties.database.mysql.host, db_port=config.properties.database.mysql.port, db_username=config.properties.database.mysql.user, db_password=config.properties.database.mysql.password, db_schema=config.properties.database.mysql.schema, ) # 正确步骤:先实例化容器 container = Containers() # 显式初始化配置(确保yaml配置被完全解析,避免参数未加载问题) container.config.init() # 从容器实例中获取数据库单例 db_instance = container.mysql_db()
关键改动说明
- 实例化容器类:
container = Containers(),触发配置文件加载和Provider初始化逻辑 - 显式调用
container.config.init():确保yaml配置被完整解析,避免后续参数缺失 - 从容器实例获取单例:
container.mysql_db(),此时Provider会正确解析配置参数,创建并返回MySQLDatabase的单例实例
FastAPI全局使用建议
在FastAPI中,可将容器实例挂载到app的state中,实现全局复用:
from fastapi import FastAPI app = FastAPI() # 初始化容器并挂载到app state app.state.container = Containers() app.state.container.config.init() # 路由中调用示例 @app.get("/") async def root(): db = app.state.container.mysql_db() # 执行数据库操作 return {"message": "Database singleton is ready"}
内容的提问来源于stack exchange,提问作者Sami Ali
相关产品推荐
相关产品推荐

