46.1. Python 2 与 Python 3

PL/Python 支持 Python 2 和 Python 3 语言变体。 (PostgreSQL 的安装说明可能包含有关确切支持的次要版本的 Python 的更准确的信息.)由于 Python 2 和 Python 3 语言变体在某些重要方面不兼容,因此 PL/Python 使用以下命名和转换方案来避免混合它们:

  • 名为plpython2u的 PostgreSQL 语言基于 Python 2 语言变体实现 PL/Python。

  • 名为plpython3u的 PostgreSQL 语言基于 Python 3 语言变体实现 PL/Python。

  • 名为plpythonu的语言基于默认的 Python 语言变体(当前为 Python 2)实现 PL/Python。(此默认值独立于任何本地 Python 安装都可以视为其“默认值”,例如/usr/bin/python可能是独立的)。 )默认值可能会在将来的 PostgreSQL 发行版中更改为 Python 3,具体取决于 Python 社区中向 Python 3 迁移的进度。

此方案类似于PEP 394中有关python命令的命名和转换的建议。

是否可以使用适用于 Python 2 的 PL/Python 或适用于 Python 3 的 PL/Python 取决于构建配置或已安装的软件包。

Tip

构建的变体取决于在安装过程中找到哪个 Python 版本,或者使用PYTHON环境变量明确设置了哪个版本;参见Section 16.4。为了使两种 PL/Python 变体在一个安装中均可用,必须对源树进行配置和构建两次。

这导致以下使用和迁移策略:

  • 现有用户和当前对 Python 3 不感兴趣的用户使用语言名称plpythonu,并且在可预见的将来无需更改任何内容。建议通过迁移到 Python 2.6/2.7 逐步“面向 Future”的代码,以简化最终迁移到 Python 3 的过程。

实际上,许多 PL/Python 函数几乎无需更改就可以迁移到 Python 3.

  • 知道自己有大量依赖 Python 2 的代码并且不打算对其进行更改的用户可以使用plpython2u语言名称。在很遥远的将来,这将 continue 起作用,直到 PostgreSQL 完全放弃对 Python 2 的支持。

  • 想要深入了解 Python 3 的用户可以使用plpython3u语言名称,它将按照当今的标准永久使用。在遥远的将来,当 Python 3 成为默认设置时,出于美学原因,他们可能希望删除“ 3”。

  • 想要构建仅 Python-3os 环境的 Daredevils,可以更改pg_pltemplate的内容以使plpythonu等效于plpython3u,但要记住,这将使其安装与世界上大多数其他地方都不兼容。

另请参阅文档Python 3.0 的新增功能,以获取有关移植到 Python 3 的更多信息。

不允许在同一会话中使用基于 Python 2 的 PL/Python 和基于 Python 3 的 PL/Python,因为动态模块中的符号会发生冲突,这可能导致 PostgreSQL 服务器进程崩溃。有一项检查可以防止在会话中混合使用 Python 主要版本,如果检测到不匹配,它将中止会话。但是,可以在同一数据库中的不同会话中使用这两种 PL/Python 变体。