我需要一个逻辑/更干净的查询来获取我创建的的所有模式名称
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';