db::connect('mysql2')可临时切换数据库连接,新建独立实例而不影响全局,默认配置需在config/database.php中定义;模型内设protected $connection = 'mysql2'可固定绑定库。

ThinkPHP 6 怎么在运行时切换数据库连接
直接用 Db::connect() 指定配置名,就能临时切库,不污染全局连接。它不是“改配置”,而是新建一个独立连接实例——这点很多人误以为是切换了默认连接,结果后续 Db::table() 还走原库。
- 必须传字符串配置名(如
'mysql2'),不能传数组或 DSN;配置需提前在config/database.php里定义好 -
Db::connect('mysql2')->table('user')->select()这一行用的是mysql2,但下一行如果写Db::table('log')->select(),仍走默认库 - 不支持链式调用后自动继承连接,每次查询都要显式调用
connect()或用闭包封装
为什么 Db::connect() 后查不到数据或报错 “No database selected”
常见原因是目标库配置里漏了 database 项,或该数据库在 MySQL 服务中根本不存在。ThinkPHP 不会自动创建库,只负责连——连上了但库名为空或错误,就会卡在执行 SQL 前。
- 检查配置中
'database' => 'my_app_v2'是否拼写正确,大小写敏感(尤其 Linux 环境) - 确认 MySQL 用户对目标库有
SELECT权限,仅能连上 host 不代表能操作库 - 如果用 socket 连接或指定了
unix_socket,确保路径真实存在且 PHP 进程可读
模型类里怎么固定用某个非默认库
在模型类顶部加 protected $connection = 'mysql2'; 即可绑定,比每次手动 connect() 更稳妥。这个值对应配置文件里的键名,不是 DSN 或 host。
- 该设置只影响当前模型的全部查询(
find、save、delete等),不影响关联模型 - 若关联模型也要走同库,得在关联定义里显式指定
'connection' => 'mysql2',否则按各自模型的$connection走 - 注意迁移命令(
php think migrate:run)不识别模型的$connection,它只按database.default执行
多库事务怎么保证原子性
ThinkPHP 原生不支持跨库事务。MySQL 层面,只有所有表都在同一个实例(哪怕不同库)才支持单事务;如果两个 Db::connect() 指向不同 MySQL 实例,事务必然失效。
- 同一 MySQL 服务下的多库:可用
Db::connect('mysql1')->transaction()包裹,只要所有表都归属该实例 - 不同 MySQL 服务(如读写分离或分库):只能用业务层补偿(TCC 或本地消息表),别硬套
transaction() - 别信网上“手动 startTransaction + commit/rollback 多次”的写法——那只是伪事务,崩溃时无法回滚
真正难的不是语法怎么写,是搞清你的“多库”到底是不是同一 MySQL 实例。很多线上问题,根子就卡在这一步没验清楚。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










