我想声明并分享一些简单,纯粹的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函数创建和公开?
答案 0 :(得分:4)
我通常做的是使用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();
,或者作为流程的一部分调用的第一个函数的一部分......或者作为你原来的功能。
答案 1 :(得分:0)
一种选择是创建一个模块然后导入它。您可以按照here所述将其位置添加到PYTHONPATH
,以确保运行时可以找到它。