症状
尽管表存在,查询却以 ERROR: relation does not exist 失败。PostgreSQL 通过 search_path 解析未限定名,因此不在路径上的 schema 中的表不可见,这正是限定查询可用而未限定失败的原因。大小写也重要:用引号创建过的标识符区分大小写,与未加引号的查找不匹配。
诊断
打印 current_schema/search_path;在 pg_tables 中搜索该表所在 schema;检查迁移是否用了不同 schema。
psql -c "\dt *.users" ; psql -c "select current_schema(), current_schemas(true)"
根因
该关系在当前会话 search_path 下不可见,原因是表位于不同 schema,或建表所在的 schema/数据库与连接所用不同。
修复
用 schema 限定表名;把该 schema 加入角色或会话的 search_path;若迁移建到了别处,则对正确 schema 与数据库重跑迁移。确认引号标识符是否造成命名不匹配。
验证
重跑失败查询确认可解析,并确认 search_path 与表所在 schema 一致。查询可解析且 schema 一致即证明修复。
常见陷阱
为图省事把 public 全塞进 search_path 会带来命名冲突与安全隐患;应显式限定或精确设置路径。