【问题标题】:In PostgreSQL, where does plpython(3)u output from `print` go?在 PostgreSQL 中,`print` 的 plpython(3)u 输出到哪里去了?
【发布时间】:2017-08-23 12:00:25
【问题描述】:

当我在 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' &

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

【问题讨论】:

    标签: python postgresql plpython


    【解决方案1】:

    您可以使用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 值(默认为warning)。

    【讨论】:

      【解决方案2】:

      an easy example付诸实践的另一个答案:

      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)
      

      我们看到infonotice 可以像打印一样使用。 debuglog 不显示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 2014-02-02
        • 1970-01-01
        相关资源
        最近更新 更多