我想声明和分享一些简单、纯 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/