Hyperf 命令行脚本可通过 Db::connection('name') 手动切换数据库连接,或在 Eloquent 模型中设置 $connection 属性绑定指定连接,亦可临时修改默认连接,但需确保 config 中已定义对应连接配置。

在 Hyperf 中,命令行脚本默认使用配置中 default 数据库连接。若需指定其他数据库连接(如 mysql_slave 或 pgsql_log),关键在于**手动切换连接上下文**,而非全局修改配置。
通过 Db::connection() 指定连接
Hyperf 的 Db 门面支持传入连接名,直接调用对应连接:
- 使用
Db::connection('slave')获取名为slave的连接实例 - 后续所有查询(
table()、select()、insert()等)均走该连接 - 适用于单次脚本执行,无需改动配置文件
示例:
// app/Command/SyncDataCommand.php
public function handle()
{
// 指定使用 'slave' 连接读取数据
$data = Db::connection('slave')
->table('users')
->where('status', 1)
->get();
// 写入则用 'master' 连接
Db::connection('master')
->table('sync_log')
->insert(['content' => json_encode($data)]);
}
在模型中指定 connection 属性
若使用 Eloquent 模型,可在模型类中声明 $connection 属性:
- 值为配置中定义的连接名(如
'pgsql_log') - 该模型所有操作自动绑定该连接,无需每次调用
connection() - 适合固定用途的模型,例如日志表、报表表等
示例:
class LogModel extends Model
{
protected $connection = 'pgsql_log';
protected $table = 'operation_logs';
}
// 调用时自动使用 pgsql_log 连接
LogModel::create(['action' => 'export']);
临时切换默认连接(不推荐长期使用)
可通过 Db::setDefaultConnection() 动态修改当前协程的默认连接:
- 仅对当前协程生效,不影响其他命令或请求
- 适合批量操作中需统一换连接的场景
- 用完建议恢复原连接,避免意外影响
示例:
$original = Db::getDefaultConnection();
Db::setDefaultConnection('backup');
User::where('id', '>=', 1000)->delete();
Db::setDefaultConnection($original); // 恢复
确认连接配置已存在
确保 config/autoload/databases.php 中已定义目标连接:
'slave' => [
'driver' => 'mysql',
'host' => '192.168.1.100',
'port' => 3306,
'database' => 'app_db',
// ... 其他参数
],
连接名(如 'slave')必须与 Db::connection('slave') 中一致,大小写敏感。


















