You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 12:05:04