Hyperf 2.2 升级到 3.0 后多数据库连接报命名空间错误,本质是旧代码沿用已废弃的 hyperf/database 组件,需彻底替换为 hyperf/db-connection 并更新所有 Hyperf\Database\ 命名空间为 Hyperf\DbConnection\,移除 Db::connection(),改用容器获取指定连接实例,并确保配置、模型及注解同步适配新命名空间。

Hyperf 2.2 升级到 3.0 后,多数据库连接报命名空间错误,本质不是“连不上库”,而是旧代码沿用了已被移除的组件路径和调用方式。核心问题在于 hyperf/database 已被废弃,新版本统一使用 hyperf/db-connection,所有相关类、接口、工厂都迁移到了 Hyperf\DbConnection 命名空间下。
替换数据库组件依赖和命名空间
必须彻底清理旧引用,不能只改个别 use 语句:
- 执行
composer remove hyperf/database,再运行composer require hyperf/db-connection - 全局搜索并替换所有
use Hyperf\Database\*→ 改为use Hyperf\DbConnection\*(例如use Hyperf\DbConnection\Connection、use Hyperf\DbConnection\ConnectionInterface) -
Db::connection('xxx')已完全移除,不能再用;多库切换必须通过 DI 容器获取指定连接实例
正确获取多库连接实例
不再有全局 Db 辅助类,每个连接需显式注入或从容器获取:
- 在服务中注入连接接口:
public function __construct(protected ConnectionInterface $connection) {}—— 这只能拿到默认连接 - 要指定连接名(如
'log_db'),需用容器手动获取:$this->container->get(ConnectionFactoryInterface::class)->get('log_db') - 查询构建器也需配套获取:
$this->container->get(QueryFactoryInterface::class)->newQuery()->from('logs')->connection('log_db')
检查配置文件与连接名一致性
命名空间错常伴随配置未生效,导致连接名找不到:
- 确认
config/autoload/databases.php中定义了多个连接,且每个name唯一(如'default'、'log_db'、'report_db') - 确保该配置文件确实在 autoload 目录下,且文件名按字母序不会被跳过(如避免命名为
_databases.php) - 不要在 .env 中用
DB_CONNECTION=log_db试图切换默认连接——这只会覆盖default名下的配置,不会新增连接名
验证注解与模型是否同步更新
如果用了 Eloquent 模型做多库操作,还需同步调整:
- 模型类中
protected $connection = 'log_db';仍有效,但前提是该连接名已在 databases.php 中正确定义 - 若用到了自定义注解(如
@DbConnection("log_db")),需确认该注解类已继承Hyperf\Di\Annotation\AbstractAnnotation,并在config/autoload/annotations.php中注册了扫描路径 - 注解类内部不能引用
Hyperf\Database\*,所有数据库操作逻辑必须基于Hyperf\DbConnection\*


















