因为我将dblink扩展安装到(默认)公共模式中,所以\df将显示所有与dblink相关的函数。我只想查看自定义函数。
如何查看不包含文本"dblink“的函数?
到目前为止我尝试过的。
\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
发布于 2021-12-09 10:27:06
你问的
如何查看不包含文本"dblink“的函数,
这些模式支持正则表达式。而不添加像!~*这样的运算符。
Unfortunately,排除了一些特殊字符。带有负前瞻的regexp可以很好地解决您的请求。但是没有运气,因为这恰好涉及到?字符,引用手册:的话
所有正则表达式特殊字符都按照第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;虽然这是一个多功能,但它也更复杂。未来版本可能会改变..。
更简单:扩展的单独模式
尽管如此,干净的解决方案是避免混乱,将扩展安装到单独的模式中,比如马已经暗示。这个相关的答案有详细的说明:
如果使用该路由,并使用名为extensions的模式,则只需更改安装dblink的模式:
ALTER EXTENSION dblink SET SCHEMA extensions;https://stackoverflow.com/questions/70256034
复制相似问题