首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >psql:使用\df显示函数,该函数做*不包含某个模式

问psql:使用\df显示函数,该函数做*不包含某个模式
EN

Stack Overflow用户
提问于 2021-12-07 07:00:43
回答 1查看 192关注 0票数 1

因为我将dblink扩展安装到(默认)公共模式中,所以\df将显示所有与dblink相关的函数。我只想查看自定义函数。

如何查看不包含文本"dblink“的函数?

到目前为止我尝试过的。

代码语言:javascript
复制
\df !~ *dblink*
\df !~ *dblink*
\df ! *dblink*
\df !*dblink*
\df ! *'dblink'
\df !~* 'dblink'
\df !~ 'dblink'
\df !~ dblink

\df dblink*将获得以"dblink“开头的所有函数。我只想要相反的。

regex链接:

https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP psql链接:

https://www.postgresql.org/docs/current/app-psql.html#APP-PSQL-PATTERNS

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-09 10:27:06

你问的

如何查看不包含文本"dblink“的函数,

这些模式支持正则表达式。而不添加像!~*这样的运算符。

Unfortunately,排除了一些特殊字符。带有负前瞻的regexp可以很好地解决您的请求。但是没有运气,因为这恰好涉及到?字符,引用手册:的话

所有正则表达式特殊字符都按照第9.7.3节中指定的方式工作,但.,?除外,它被翻译成. .

否则,我只能想到字符类来排除模式,作为一种解决办法:

代码语言:javascript
复制
test=> \df public.([^d]|.[^b]|..[^l]|...[^i]|....[^n]|.....[^k])*

显示架构public中不以“dblink”开头的所有表。它是一个有分支的正则表达式

  • 第一个分支[^d]允许所有不以'd‘开头的名称,
  • 第二分支.[^b]允许所有没有'b‘作为第二个字符

等。

由于长字符串很难键入,所以可以将其保存到psql变量中,并插入以下内容:

代码语言:javascript
复制
test=> \set dbx 'public.([^d]|.[^b]|..[^l]|...[^i]|....[^n]|.....[^k])*'
test=> \df :dbx

您甚至可以将该\set命令放入~/.psqlrc文件中,以便将其自动加载到psql中。

SQL解决方案

或者,您可以查询系统目录:

代码语言:javascript
复制
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的模式:

代码语言:javascript
复制
ALTER EXTENSION dblink SET SCHEMA extensions;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70256034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档