38.3. 数据库访问 #
PL/Python 语言模块会自动导入一个名为 plpy 的 Python 模块。该模块中的函数和常量在 Python 代码中可以通过 plpy. 这样的形式访问。目前 fooplpy 实现了函数
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配置变量控制。更多信息见第 16.4 节。
此外,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 文档(第 39 章)。为了在函数调用之间有效地利用这一点,需要使用持久存储字典
SD 或 GD(见第 38.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 plpythonu;