你问的
如何查看不包含文本“dblink”的函数,
这些模式支持正则表达式。 不添加像!~*
.
不幸的是,一些特殊字符被排除在外。带有负前瞻的正则表达式可以很好地解决您的请求。但没有运气,因为这恰好涉及?
字符,并且引用手册:
所有正则表达式特殊字符都按照第 9.7.3 节中的规定工作,除了 [...],?
它被翻译成.
[...]
除此之外,我只能将排除模式的字符类视为一种解决方法:
test=> \df public.([^d]|.[^b]|..[^l]|...[^i]|....[^n]|.....[^k])*
显示架构public
中不以“dblink”开头的所有表。这是一个带有分支的正则表达式:
- 第一个分支
[^d]
允许所有不以'd'开头的名称,
- 第二个分支
.[^b]
允许所有没有'b'作为第二个字符
等等。
由于长字符串难以输入,您可以将其保存到 psql 变量中,然后插入:
test=> \set dbx 'public.([^d]|.[^b]|..[^l]|...[^i]|....[^n]|.....[^k])*'
test=> \df :dbx
您甚至可以将该\set
命令放入您的~/.psqlrc
文件中以使其自动加载到 psql 中。
SQL解决方案
或者,您可以查询系统目录:
SELECT n.nspname AS "Schema", p.proname AS "Name"
, pg_catalog.pg_get_function_result(p.oid) AS "Result data type"
, pg_catalog.pg_get_function_arguments(p.oid) AS "Argument data types"
, CASE p.prokind WHEN 'a' THEN 'agg' WHEN 'w' THEN 'window' WHEN 'p' THEN 'proc' ELSE 'func' END AS "Type"
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE pg_function_is_visible (p.oid) -- only visible functions like plain \df
AND n.nspname NOT LIKE 'pg\_%' -- exclude catalog schemas
AND p.proname NOT LIKE 'dblink%' -- exclude pattern
ORDER BY 1, 2, 4;
虽然这更通用,但它也更复杂。并且可能会更改为将来的版本...
更简单:扩展的单独架构
也就是说,干净的解决方案是避免混乱并将扩展安装到单独的架构中,就像a_horse 已经暗示的那样。这个相关的答案有详细的说明:
如果你走这条路,并使用一个名为 的模式extensions
,那么你可以简单地更改安装的模式dblink
:
ALTER EXTENSION dblink SET SCHEMA extensions;