On this page
45.2. PL/Python 函数
PL/Python 中的函数通过标准的CREATE FUNCTION语法声明:
CREATE FUNCTION funcname (argument-list)
RETURNS return-type
AS $$
# PL/Python function body
$$ LANGUAGE plpythonu;
函数的主体只是一个 Python 脚本。调用该函数时,其参数将作为列表args
的元素传递;命名参数也作为普通变量传递给 Python 脚本。使用命名参数通常更易读。结果以通常的方式从 Python 代码以return
或yield
返回(如果是结果集语句)。如果不提供返回值,Python 将返回默认值None
。 PL/Python 将 Python 的None
转换为 SQL 空值。
例如,返回两个整数中较大的一个的函数可以定义为:
CREATE FUNCTION pymax (a integer, b integer)
RETURNS integer
AS $$
if a > b:
return a
return b
$$ LANGUAGE plpythonu;
作为函数定义的主体给出的 Python 代码将转换为 Python 函数。例如,以上结果导致:
def __plpython_procedure_pymax_23456():
if a > b:
return a
return b
假设 23456 是 PostgreSQL 分配给函数的 OID。
参数设置为全局变量。由于 Python 的作用域规则,这产生了一个微妙的结果,就是除非在变量中将变量重新声明为全局变量,否则无法在函数内部将参数变量重新分配给涉及变量名称本身的表达式的值。例如,以下操作将无效:
CREATE FUNCTION pystrip(x text)
RETURNS text
AS $$
x = x.strip() # error
return x
$$ LANGUAGE plpythonu;
因为分配给x
会使x
成为整个块的局部变量,所以赋值右侧的x
指的是尚未分配的局部变量x
,而不是 PL/Python 函数参数。使用global
语句,可以使其工作:
CREATE FUNCTION pystrip(x text)
RETURNS text
AS $$
global x
x = x.strip() # ok now
return x
$$ LANGUAGE plpythonu;
但是建议不要依赖 PL/Python 的实现细节。最好将函数参数视为只读。