8

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

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

do $$ begin perform log( ( 42 + 108 )::text ); end; $$;

输出不会出现在终端中(使用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' )
    $$;

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

tail -f /tmp/psql-output | sed 's/^.*$/\x1b[38;05;214m\0\x1b[0m/g' &

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

4

2 回答 2

5

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

plpy.debug(msg, **kwargs)
plpy.log(msg, **kwargs)
plpy.info(msg, **kwargs)
plpy.notice(msg, **kwargs)
plpy.warning(msg, **kwargs)

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

于 2019-11-19T09:36:39.120 回答
0

另一个答案通过一个简单的例子付诸实践:

create or replace function pddesc(x numeric[])
returns table(count float, mean float, std float, min float)
as $$
    import pandas as pd
    import numpy as np
    data=pd.Series(x)

    count=data.describe()[0]
    mean=data.describe()[1]
    std=data.describe()[2]
    min=data.describe()[3]

    ## print an INFO of the output:
    plpy.debug('debug:', np.array([count, mean, std, min]))
    plpy.log(np.array([count, mean, std, min]))
    plpy.info(np.array([count, mean, std, min]))
    plpy.info('test')
    plpy.notice(np.array([count, mean, std, min]))
    plpy.notice(np.array([count, mean, std, min]).reshape(1,-1))
    plpy.warning(np.array([count, mean, std, min]))

    return np.array([count, mean, std, min]).reshape(1,-1)
    ## or with the same result:
    # return np.hstack((count, mean, std, min)).reshape(1,-1)

$$ language plpython3u;

输出:

postgres=# SELECT * FROM pddesc(ARRAY[1,2,3]);
INFO:  [3 3 Decimal('1') 1]
INFO:  test
NOTICE:  [3 3 Decimal('1') 1]
NOTICE:  [[3 3 Decimal('1') 1]]
WARNING:  [3 3 Decimal('1') 1]
 count | mean | std | min
-------+------+-----+-----
     3 |    3 |   1 |   1
(1 row)

我们看到了这一点,info并且notice可以像打印一样使用。debug并且log不要出现。

于 2021-09-04T18:53:34.060 回答