psql: 使用 \df 显示 *不* 包含特定模式的函数
psql: display functions with \df that do *not* contain a certain pattern
因为我将 dblink 扩展安装到(默认)public 架构中,\df
将显示所有与 dblink 相关的函数。我只想查看自定义功能
如何查看不包含文本“dblink”的函数?
到目前为止我尝试了什么。
\df !~ *dblink*
\df !~ *dblink*
\df ! *dblink*
\df !*dblink*
\df ! *'dblink'
\df !~* 'dblink'
\df !~ 'dblink'
\df !~ dblink
\df dblink*
将得到所有以“dblink”开头的函数。我只想要相反的东西。
正则表达式 link:
https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP
psql link:
https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS
你问的是什么
How can I see function that not contain text "dblink",
Regular expressions are supported in these patterns. 没有 添加像 !~*
.
这样的运算符
不幸的是,一些特殊字符被排除在外。带有 negative lookahead would solve your request nicely. But no luck, because that happens to involve the ?
characters and, quoting the manual:
的正则表达式
All regular expression special characters work as specified in Section 9.7.3, except for [...], ?
which is translated to .
[...]
除此之外,我只能想到字符 类 到 排除 模式作为解决方法:
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;
虽然这更通用,但也更复杂。并且可能会在未来的版本中发生变化...
更简单:扩展的单独架构
也就是说,干净的解决方案是避免混乱,将扩展安装到单独的架构中,如 。这个相关回答有详细说明:
如果你走那条路,并使用名为 extensions
的架构,你可以简单地 更改 安装了 dblink
的架构:
ALTER EXTENSION dblink SET SCHEMA extensions;
因为我将 dblink 扩展安装到(默认)public 架构中,\df
将显示所有与 dblink 相关的函数。我只想查看自定义功能
如何查看不包含文本“dblink”的函数?
到目前为止我尝试了什么。
\df !~ *dblink*
\df !~ *dblink*
\df ! *dblink*
\df !*dblink*
\df ! *'dblink'
\df !~* 'dblink'
\df !~ 'dblink'
\df !~ dblink
\df dblink*
将得到所有以“dblink”开头的函数。我只想要相反的东西。
正则表达式 link:
https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP
psql link:
https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS
你问的是什么
How can I see function that not contain text "dblink",
Regular expressions are supported in these patterns. 没有 添加像 !~*
.
这样的运算符
不幸的是,一些特殊字符被排除在外。带有 negative lookahead would solve your request nicely. But no luck, because that happens to involve the ?
characters and, quoting the manual:
All regular expression special characters work as specified in Section 9.7.3, except for [...],
?
which is translated to.
[...]
除此之外,我只能想到字符 类 到 排除 模式作为解决方法:
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;
虽然这更通用,但也更复杂。并且可能会在未来的版本中发生变化...
更简单:扩展的单独架构
也就是说,干净的解决方案是避免混乱,将扩展安装到单独的架构中,如
如果你走那条路,并使用名为 extensions
的架构,你可以简单地 更改 安装了 dblink
的架构:
ALTER EXTENSION dblink SET SCHEMA extensions;