查询以获取Postgres中的架构名称



我需要一个逻辑/更干净的查询来获取我创建的的所有模式名称

select schema_name  
from "information_schema"."schemata"

SELECT nspname
FROM pg_catalog.pg_namespace;

返回具有系统创建的模式的模式名称的超集,而我不需要该超集。

我只想要我创建的模式名称。

尝试从information_schema.schemata过滤pg_*模式和information_schema本身:

SELECT * from information_schema.schemata 
WHERE NOT schema_name LIKE 'pg_%' AND schema_name <> 'information_schema'

按照Gordon的建议,排除postgres拥有的模式只适用于postgres不是任何其他模式的所有者,而是系统模式的所有者的条件。如果您使用用户postgres创建了一个架构,它将从结果集中排除。

如果您不想要内置模式,请使用:

select schema_name
from "information_schema"."schemata"
where schema_owner <> 'postgres';

如果你想要你专门创建的,那么检查一下你是所有者的那些。

select
*,
nspowner::regrole as role_name
from pg_namespace
where nspowner = 'postgres'::regrole;

返回所有者为postgres用户的所有方案。将其更改为您的用户名以获得您拥有的方案。

https://www.postgresql.org/docs/current/datatype-oid.html

下面的查询解决了我的问题

SELECT distinct pg_namespace.nspname 
FROM pg_catalog.pg_inherits INNER JOIN
pg_catalog.pg_class ON (pg_inherits.inhrelid = pg_class.oid) INNER JOIN
pg_catalog.pg_namespace ON (pg_class.relnamespace = pg_namespace.oid)
WHERE pg_namespace.nspname <> 'public';