highgo支持thinkphp标准pdo驱动,需设'type'=>'pgsql'并显式配置params中pdo::attr_errmode=>pdo::errmode_exception、pdo::attr_default_fetch_mode=>pdo::fetch_assoc、pdo::attr_emulate_prepares=>false,以及options=>['-c search_path=public'],hostport须指定highgo实际端口(如5866),charset用utf8,且需手动确保public schema存在及sequence所有权绑定。

HighGo 是否支持 ThinkPHP 的标准 PDO 驱动
可以,但需手动指定 PDO::ATTR_ERRMODE 和 PDO::ATTR_DEFAULT_FETCH_MODE,否则查询结果可能为空或报错。HighGo 是基于 PostgreSQL 9.6 分支深度定制的国产数据库,协议层与 pgsql 兼容,ThinkPHP 不提供原生 highgo 驱动类型,必须用 'type' => 'pgsql' 并补全关键参数。
常见错误现象包括:SQLSTATE[HY000] Unknown error、Call to a member function fetchAll() on bool,本质是 PDO 初始化未设异常模式,导致错误被静默吞掉。
- 务必在
params中显式设置PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION -
PDO::ATTR_DEFAULT_FETCH_MODE建议设为PDO::FETCH_ASSOC,避免FETCH_BOTH引发字段名大小写冲突(HighGo 默认返回小写字段) - 不推荐使用
DB_TYPE => 'pdo'+DB_DSN的旧式写法,TP8 已转向数组驱动配置,DB_DSN会被忽略
config/database.php 中 HighGo 连接配置怎么写
直接复用 pgsql 配置结构,但 hostname、port、database 等字段需按 HighGo 实际部署填写;字符集统一用 utf8(HighGo 不支持 utf8mb4),且必须关闭 prepared statement 模拟(HighGo 对 PDO::ATTR_EMULATE_PREPARES 兼容性差)。
示例最小可行配置:
'highgo' => [
'type' => 'pgsql',
'hostname' => '192.168.10.50',
'database' => 'app_prod',
'username' => 'hguser',
'password' => 'hgpass123',
'hostport' => 5866, // HighGo 默认端口非 5432
'charset' => 'utf8',
'prefix' => '',
'params' => [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
],
],
-
hostport必须显式写,HighGo 安装时通常改用5866或65432,不填会连到本地 pgsql 默认端口 -
charset设为utf8即可,HighGo 内部以 UTF-8 编码存储,设utf8mb4反而触发连接拒绝 - 若连接提示
server closed the connection unexpectedly,大概率是PDO::ATTR_EMULATE_PREPARES未关
Schema 设置:如何让 migrate 和 model 正确识别 HighGo 的 public schema
HighGo 默认 schema 是 public,但 ThinkPHP 的 Schema 类在 pgsql 驱动下默认不显式指定 search_path,导致 php think migrate:status 查不到表、Db::name('user') 报 relation "user" does not exist。
解决方式是在 params 中注入 PDO::PGSQL_ATTR_DISABLE_PREPARE 并追加 options 参数强制设置 search_path:
- 在
params数组里加:PDO::PGSQL_ATTR_DISABLE_PREPARE => true - 同时在连接配置顶层加键:
'options' => ['-c search_path=public'] - 注意:
options是 ThinkPHP 特有配置项(非 PDO 常量),必须和params同级,不能塞进params里 - 执行迁移前,确保目标库中已存在
publicschema(HighGo 不自动创建,需手动CREATE SCHEMA IF NOT EXISTS public;)
连接测试与常见兼容性断点
HighGo 对部分 PostgreSQL 语法做了限制或增强,最易踩坑的是序列(sequence)和时间函数。ThinkPHP 的 autoinc 字段依赖 nextval(),但 HighGo 要求显式指定 schema,否则报 sequence "user_id_seq" does not exist。
- 建表迁移中,主键自增字段必须写全路径:
$table->bigInteger('id')->autoIncrement()->comment('主键');生成的 SQL 会带public.user_id_seq,否则需手动在 HighGo 中执行ALTER SEQUENCE public.user_id_seq OWNED BY public.user.id; -
now()函数可用,但current_timestamp(3)不支持毫秒精度,建议统一用now()::timestamp without time zone - 执行
php think db:build生成模型时,字段类型映射基本正常,但jsonb会被识别为text,需手动在模型中加protected $json = ['extra'];
真正麻烦的不是连上,而是 schema 行为差异和 sequence 所有权绑定——这两处不提前处理,上线后 insert 会静默失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











