Psql新手疑问:执行\d显示无关系但存在非默认Postgres表
嘿,刚接触psql遇到这种疑惑很正常,我来帮你拆解下这个问题~
为什么\d显示“No relations found”但查询pg_class有36个对象?
核心原因是**\d的显示范围和pg_class包含的对象类型完全不一样**:
\d的默认显示规则
psql的\d命令默认只展示你有访问权限的表、视图、序列、物化视图(也就是PostgreSQL里定义的“可查询关系”)。像索引、约束、函数、自定义类型这些对象,\d是不会列出来的。pg_class包含的对象范围pg_class是PostgreSQL的系统表,它几乎包含了所有数据库对象的元数据——除了上面说的表/视图,还包括索引、主键约束、触发器、函数、序列甚至是系统内部的对象。你查到的36个对象,大概率是这些\d不默认显示的类型。
怎么验证对象类型?
你可以跑下面的查询,直观看到这些对象的具体类型:
select s.nspname as schema_name, c.relname as object_name, c.relkind as object_type, case c.relkind when 'r' then '普通表' when 'v' then '视图' when 's' then '序列' when 'i' then '索引' when 'c' then '复合类型/约束' when 'f' then '外部表' when 'm' then '物化视图' end as object_type_cn from pg_class c join pg_namespace s on s.oid = c.relnamespace where s.nspname not in ('pg_catalog', 'information_schema') and s.nspname not like 'pg_temp%' order by schema_name, object_type, object_name;
查看结果里的object_type或object_type_cn列,就能清楚这些36个对象到底是什么了。
如果确实有表但\d看不到怎么办?
如果查询后发现里面有普通表(object_type是r)但\d没显示,那就是权限问题:虽然你给admin授予了数据库的所有权限,但数据库级别的权限不会自动继承到对象(比如表)级别。postgres用户创建的表,admin默认没有访问权限。
解决方法是让postgres用户给admin授予对应权限:
-- 授予public schema下已存在的所有表的SELECT权限 GRANT SELECT ON ALL TABLES IN SCHEMA public TO admin; -- 授予未来在public schema创建的表的默认SELECT权限 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO admin;
如果需要修改/插入权限,把SELECT换成ALL PRIVILEGES即可。
另外,你也可以用更精准的psql命令查看特定类型的对象:
\dt:只看表\dv:只看视图\di:只看索引\df:只看函数
内容的提问来源于stack exchange,提问作者jc13
相关产品推荐
相关产品推荐

