PL/Python 语言模块自动输入一个叫 plpy 的
Python 模块。在这个模块里的函数和常量可以在你的 Python 代码里以
plpy.foo 的名字获得。
目前,plpy 实现了函数
plpy.debug(msg),
plpy.log(msg),
plpy.info(msg),
plpy.notice(msg),
plpy.warning(msg),
plpy.error(msg),和
plpy.fatal(msg)。
plpy.error
和 plpy.fatal
实际上抛出一个 Python 例外,如果你没有捕获这个例外,会传播到调用的查询,
导致当前事务或者子事务退出。
raise plpy.ERROR(msg) 和
raise plpy.FATAL(msg)
分别等效于调用 plpy.error
和 plpy.fatal
。
其它函数只生成不同优先级的信息。特定优先级的信息是汇报给客户端,
写到服务器日志还是两件事都做,是由 log_min_messages
和 client_min_messages 配置参数控制的。
参阅 Chapter 17 获取更多信息。
另外,plpy 模块提供两个函数,叫
execute
和 prepare
。
拿一个查询字串和一个可选的限制参数调用
plpy.execute
可以运行该查询,并且结果返回到一个结果对象里。
结果对象仿真一个列表或者一个字典对象。
结果对象可以通过行号和字段名来访问。它有下面这些额外的方法:
nrows()
返回该查询返回的行数,
而 status
是 SPI_execute()
的返回变量。结果对象可能被修改。
比如:
rv = plpy.execute("SELECT * FROM my_table", 5)
返回来自my_table中最多 5 行。如果my_table有一个my_column字段, 那么你可以用下面的方法访问它
foo = rv[i]["my_column"]
第二个函数,plpy.prepare
,为一个查询准备查询规划。
它是带一个查询字串和一个参数类型列表(如果你在该查询里有引用变量)调用的,
比如:
plan = plpy.prepare("SELECT last_name FROM my_users WHERE first_name = $1", [ "text" ])
text是你将作为$1传递的变量的类型。
在准备一个语句之后,你用函数 plpy.execute
运行它。
rv = plpy.execute(plan, [ "name" ], 5)
第三个参数是限制,是可选的。
在你用 PL/Python 模块准备一个计划的时候,该计划是自动保存的。 请阅读 SPI 文档(Chapter 40)获取这句话的含义。 为了能跨函数调用有效地使用这个特点,我们需要使用永久存储字典 SD 或 GD 之一,(参阅 Section 39.1)。比如:
CREATE FUNCTION usesavedplan ( ) RETURNS trigger AS $$ if SD.has_key("plan"): plan = SD["plan"] else: plan = plpy.prepare("SELECT 1") SD["plan"] = plan # rest of function $$ LANGUAGE plpython;