在 PostgreSQL 中,`print` 的 plpython(3)u 输出到哪里去了?

Joh*_*zer 7 python postgresql plpython

当我在 PostgreSQL 中创建以下函数时:

create function log( value variadic text[] )
  returns void
  language plpython3u
  as $$
    print( ' '.join( value ) + '\n' )
    $$;

do $$ begin perform log( ( 42 + 108 )::text ); end; $$;
Run Code Online (Sandbox Code Playgroud)

输出未出现在终端中(使用psql -f ...)。它会去哪里?

此外,是否有任何简单的方法(可能是扩展)可以为我提供易于使用的输出stdout/ stderr?我不想使用,select因为所有输出都带有表装饰,您可以关闭它,但只能使用psql在函数中不起作用的技巧。同样,我不想使用\echo,因为这在函数定义中不起作用。

编辑我知道plpy.notice(),但该功能也将其输出包围在一大堆混乱中。


顺便说一句,我现在的解决方案是写入文件:

create function log( value variadic text[] )
  returns void
  language plpython3u
  as $$
    with open( '/tmp/psql-output', 'a' ) as o:
      o.write( ' '.join( value ) + '\n' )
    $$;
Run Code Online (Sandbox Code Playgroud)

并在后台运行一条尾巴(使用 ANSI 颜色,是的!):

tail -f /tmp/psql-output | sed 's/^.*$/\x1b[38;05;214m\0\x1b[0m/g' &
Run Code Online (Sandbox Code Playgroud)

但缺点是我需要外部代码来设置这个东西。

小智 7

您可以使用plpy的功能来打印消息。

plpy.debug(msg, **kwargs)
plpy.log(msg, **kwargs)
plpy.info(msg, **kwargs)
plpy.notice(msg, **kwargs)
plpy.warning(msg, **kwargs)
Run Code Online (Sandbox Code Playgroud)

如果 log_destination 为“stderr”,则始终输出 plpy.log(),其他函数根据 log_min_messages 值(默认为警告)。