Webman支持MySQL和PostgreSQL同时接入,需在config/database.php的connections数组中分别定义'mysql'和'pgsql'连接,通过Db::connection('mysql')或Db::connection('pgsql')显式调用,模型用$connection属性绑定对应键名,跨库事务不支持,须手动实现补偿机制。

Webman 支持 MySQL 和 PostgreSQL 同时接入,但必须在 config/database.php 中显式定义两个连接,并通过 Db::connection() 或模型的 $connection 属性手动切换——框架不会自动识别或路由到不同驱动的库。
如何在 config/database.php 中同时配置 MySQL 和 PostgreSQL 连接
Webman 的数据库配置是扁平结构,connections 数组下可并列声明任意多个连接,只要 driver、host、database 等关键项完整即可。MySQL 和 PostgreSQL 驱动互不干扰,但需确保 PHP 已安装对应扩展(pdo_mysql 和 pdo_pgsql)。
- 打开
config/database.php,确认'default' => 'mysql'指向你希望作为主连接的驱动 - 在
'connections'数组中新增'pgsql'键,内容示例:'pgsql' => [ 'driver' => 'pgsql', 'host' => '192.168.1.200', 'port' => 5432, 'database' => 'analytics_db', 'username' => 'analyst', 'password' => $_ENV['PG_PASS'], 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'require', ], - MySQL 连接保持原样(如
'mysql'),无需改动;PostgreSQL 连接名可以任意命名(比如'analytics'),只要调用时一致即可 - 保存后执行
php start.php restart,配置才生效
Db::connection() 调用时必须传入连接名,不能只靠 driver 区分
Webman 不支持“根据 SQL 语法自动选择 PostgreSQL 或 MySQL 连接”。Db::connection() 的参数是配置中的键名(如 'mysql' 或 'pgsql'),不是驱动类型。传错名字会抛出 InvalidArgumentException: Database connection [xxx] not configured.。
- 查 MySQL 用户表:
Db::connection('mysql')->table('users')->where('id', 1)->first() - 查 PostgreSQL 统计表:
Db::connection('pgsql')->table('daily_summary')->whereDate('date', today())->get() - 若误写成
Db::connection('postgresql'),而配置里实际叫'pgsql',就会报错 - 不指定连接名时,默认走
config('database.default')对应的连接,与当前执行的 SQL 无关
Model 绑定多驱动连接时,$connection 值必须与配置键完全匹配
模型类通过 $connection 属性绑定连接,这个字符串必须和 config/database.php 中 connections 下的键名一字不差。大小写、下划线、拼写错误都会导致 ORM 查询落到默认连接上,甚至静默写入错误库。
立即学习“PHP免费学习笔记(深入)”;
- 正确写法(假设配置里是
'pgsql'):class Report extends Model { protected $connection = 'pgsql'; protected $table = 'reports'; } - 错误写法:
protected $connection = 'postgre'、'PostgreSQL'、'pg'—— 全部无效 - 混合使用时,建议给模型加注释说明归属,例如
// belongs to analytics_db via pgsql connection - 跨驱动关联(如 MySQL User hasMany PostgreSQL Log)无法用 Eloquent 自动处理,必须手动查两次 + 合并数据
事务无法跨 MySQL 和 PostgreSQL 连接执行
Webman 底层用的是 Illuminate/Database,它不支持分布式事务。当你对两个不同连接分别开启事务(Db::connection('mysql')->transaction() 和 Db::connection('pgsql')->transaction()),它们完全独立,失败时不会回滚对方。
- 典型风险场景:MySQL 写订单成功,PostgreSQL 写日志失败 → 订单已存在但无审计记录
- 必须自行实现补偿逻辑,例如:先写 PostgreSQL 日志,再写 MySQL 订单;失败则重试日志或告警人工介入
- 不要依赖
DB::transaction()包裹双连接操作——它只作用于默认连接 - 如果业务强依赖原子性,应考虑合并到单库(如全迁至 PostgreSQL),或引入消息队列解耦
最易被忽略的一点:PostgreSQL 的 schema 配置默认是 'public',但如果你的表在 'reporting' schema 下,必须显式设置 'schema' => 'reporting',否则 table('metrics') 会查 public.metrics 并报错 relation "metrics" does not exist。



















