↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 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.4 已结束支持。 请参阅 当前版本手册.

40.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_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)

第三个参数是 limit,它是可选的。

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

当你用 PL/Python 模块准备一个计划时,它会被自动保存。阅读 SPI 文档(第 41 章)了解这意味着什么。为了在函数调用之间有效地利用这一点,需要使用持久存储字典 SD 或 GD 之一(见第 40.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;

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.