在PL / Python函数之间重用纯Python函数

我想声明并分享一些简单,纯粹的python函数
两个或更多PL / Python函数.我正在使用Postgres 9.3.

例如,我有:

 CREATE OR REPLACE FUNCTION get_mod(modifier varchar)
  RETURNS varchar
    AS $$
      def is_float(val):
        try:
            if val:
               float(val)
               return True
            else:
               return False
        except ValueError:
            return False
      if modifier is None:
        return "NOMOD"
      if is_float(modifier):
        return str(float(modifier)*1)
      return modifier
    $$LANGUAGE plpythonu;

我想在其他一些PL / Python函数中使用函数is_float.
我知道我可以创建它作为可调用的PL / Python函数,但我发现更多的笨重(执行基于sql的PL / Python调用),而不是直接调用纯Python,自定义实用程序函数.

是否可以在Postgres上通过PL / Python可重用的纯Python函数创建和公开?

最佳答案
我通常做的是使用GD传递函数.缺点是,由于GD是每个会话对象,因此每次启动新会话时都需要加载它.您可以采用的方法是使用一个引导函数,该函数在每个会话开始时运行,以便为数据库提供进一步的使用.就像是:

create or replace function bootstrap() returns void
as
$$
def is_float(val):
  # did some simplifying here,try:   
    float(val) # Take notice that booleans will convert to float successfully
    return True
  except (ValueError,TypeError):
    return False

GD['is_float'] = is_float
$$language plpythonu;

现在您可以修改原始功能

CREATE OR REPLACE FUNCTION get_mod(modifier varchar)
 RETURNS varchar
    AS $$
      # Optionally run bootstrap() here
      plpy.execute("select bootstrap()")
      ###
      if modifier is None:
        return "NOMOD"
      if GD['is_float'](modifier):
        return str(float(modifier)*1)
      return modifier
    $$LANGUAGE plpythonu;

为了使其工作,你必须运行select bootstrap();在每个会话开始时,或者作为流程的一部分调用的第一个函数的一部分……或者作为原始函数的一部分.

相关文章

在这篇文章中,我们深入学习了XPath作为一种常见的网络爬虫技巧。XPath是一种用于定位和选择XML文档中特...
祝福大家龙年快乐!愿你们的生活像龙一样充满力量和勇气,愿你们在新的一年里,追逐梦想,勇往直前,不...
今天在爬虫实战中,除了正常爬取网页数据外,我们还添加了一个下载功能,主要任务是爬取小说并将其下载...
完美收官,本文是爬虫实战的最后一章了,所以尽管本文着重呈现爬虫实战,但其中有一大部分内容专注于数...
JSON是一种流行的数据传输格式,Python中有多种处理JSON的方式。官方的json库是最常用的,它提供了简单...
独立样本T检验适用于比较两组独立样本的均值差异,而配对T检验则适用于比较同一组样本在不同条件下的均...