Chapter 39. PL/Python - 过程语言

Table of Contents
39.1. PL/Python 函数
39.2. 触发器函数
39.3. 数据库访问

PL/Python 过程语言允许用 Python 语言PostgreSQL 函数。

要在特定数据库里安装 PL/Python,使用 createlang plpython dbname

提示: 如果一门语言安装到了 template1 里面, 那么所有随后创建的数据库都会自动安装该语言。

PostgreSQL 7.4 为止,PL/Python 只能当作一种"不可信任的"语言 (意思是它没有提供任何限制用户可为与不可为的手段)。因此,它被重新命名为 plpythonu。 可信任的 plpython 可能在将来的某个时间能够获得,条件是在 Python 里开发出了新的安全执行机制。

注意: 使用源码包的用户必须在安装过程中声明打开 PL/Python 的制作。 (请参考安装指导获取更多信息。)二进制包的用户可能会在独立的子包中找到 PL/Python。

39.1. PL/Python 函数

PL/Python 写的函数用通常的 CREATE FUNCTION 方法声明。比如:

CREATE FUNCTION myfunc(text) RETURNS text
	AS 'return args[0]'
LANGUAGE plpython;

以函数体形式给出的 Python 转换成 Python 函数。比如,上面的转换成

def __plpython_procedure_myfunc_23456():
	return args[0]

这里假设 23456 是 PostgreSQL 赋予这个函数的 OID。

如果你没有提供返回数值,Python 返回缺省的 NonePL/Python 把 Python 的None 转换成 SQL 的空值。

PostgreSQL函数变量可以通过全局的 args 列表获取. 在 myfunc 例子里, args[0] 包含当做文本参数传递的数值。对于 myfunc2(text, integer)args[0] 将包含 text 参数和整数变量 args[1]

全局字典SD可以用于在函数调用中间存储数据。 这个变量是私有静态数据。全局字典GD是公共数据, 可以在一个后端里的所有 python 函数之间使用。用时小心。

每个函数都在 Python 解释器里获得自己的受限制的执行对象, 因此来自 myfunc 的全局数据很函数参数是 myfunc2 所看不到的。 这里的例外是我们上面提到的GD字典。