↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3
历史版本PostgreSQL 7.3 已于 2007 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

22.3. 数据库访问 #

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")。它们大体上等价于 从 C 代码中调用 elog(LEVEL, "msg") 。 plpy.error 和 plpy.fatal 实际上会引发一个 Python 异常, 如果未被捕获,该异常会使 PL/Python 模块在函数处理器 从 Python 解释器返回时调用 elog(ERROR, msg)。从 Python 解释器中长跳转(long-jump)出来可能不太好。 raise plpy.ERROR("msg") 和 raise plpy.FATAL("msg") 分别等价于调用 plpy.error 和 plpy.fatal。

此外,plpy 模块提供两个名为 execute 和 prepare 的函数。带一个查询字符串和一个 可选的 limit 参数调用 plpy.execute 会运行该查询并把结果 作为一个结果对象返回。结果对象模拟 列表或字典对象。结果对象可以按 行号和字段名访问。它有这些额外的方法: nrows() 返回查询返回的行数, status 是 SPI_exec 的返回变量。结果对象 可以被修改。

例如,

rv = plpy.execute("SELECT * FROM my_table", 5)

从 my_table 返回最多 5 行。如果 my_table 有一个字段 my_field,可以这样访问它:

foo = rv[i]["my_field"]

第二个函数 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)

调用 plpy.execute 时 limit 参数是可选的。

在当前版本中,运行 PL/Python 函数时遇到的任何数据库错误都会导致 服务器立即终止该函数;不可能用 Python 的 try ... catch 构造捕获错误 条件。例如,传递给 plpy.execute() 调用的 SQL 语句中的一个语法错误 将终止该函数。这一行为可能在 未来的版本中改变。

当你用 PL/Python 模块准备一个计划时,它会被 自动保存。阅读 SPI 文档(第 17 章)了解这意味着什么。

为了在函数调用之间有效地利用这一点, 需要使用持久存储字典 SD 或 GD,见 第 22.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';

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。