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

标签 python postgresql plpython

我想声明和分享一些简单、纯 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 自定义实用程序函数要笨拙得多。

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

最佳答案

我通常做的是使用 GD 传递函数.不利之处在于,由于 GD 是每个 session 对象,因此您需要在每次启动新 session 时加载它。解决这个问题的方法是在每个 session 开始时运行一个引导函数,准备 数据库以供进一步使用。像这样的东西:

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;

为了使其正常工作,您必须在每个 session 开始时运行 select bootstrap();,或者作为您在流程中调用的第一个函数的一部分。 .. 或者确实是您原始功能的一部分。

关于python - 在 PL/Python 函数之间重用纯 Python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21641722/

相关文章:

Python:未更新文档字符串

python - 使用 cx-freeze 时没有名为 bs4 的模块

python - 如果窗口大小调整,则调整窗口小部件的大小

PostgreSQL:删除记录以保留具有最新时间戳的记录

ruby - 如何使用 PG Ruby Gem 有条件地回滚事务

postgresql - Postgres 中的 Unicode 规范化

python - numpy用向量减去矩阵的每一行

postgresql - 如何在不使用双引号的情况下以驼峰而不是小写形式获取 Postgres 中的列别名?

python - postgres 和 python

python - 如何在 Python 中将匹配对聚合到 "connected components"