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 还是 Python 3 的 PL/Python 可用或是两者都可用,取决于编译配置或者被安装的包。
如果是编译安装,则取决于在安装期间找到的 Python 版本或者用PYTHON
环境变量显式设置的版本,见第 16.4 节。要在一个安装中让两种变体的 PL/Python 都可用,源代码树必须被配置和编译两次。
这产生了下列的使用和迁移策略:
现有用户以及对 Python 3 不感兴趣的用户使用plpythonu
语言并且在可预见的未来不必做出任何改变。我们推荐通过迁移到 Python 2.6/2.7 逐步地让代码“经得起未来的考验”以简化最终迁移到 Python 3 的工作。
实际上,很多 PL/Python 函数可以用很少或者不做修改就迁移到 Python 3。
对于代码严重依赖于 Python 2 并且不打算做改变的用户可以使用plpython2u
语言。这将在很长时间内都有效,直到 PostgreSQL 完全删除掉对 Python 2 的支持。
想投入 Python 3 的怀抱的用户可以使用plpython3u
语言,在当前的标准下这将一直有效。在遥远的未来,当 Python 3 成为默认以后,出于审美的原因,“3”可能会被移除。
想要构建一个只有 Python 3 的操作系统环境的冒险者们,可以更改pg_pltemplate
的内容让plpythonu
等价于plpython3u
,记住这将会让他们的安装与世界的其他大部分东西都不兼容。
有关移植到 Python 3 的更多信息还可见文档What's New In Python 3.0。
不允许在同一个会话中使用基于 Python 2 的 PL/Python 以及基于 Python 3 的 PL/Python,因为动态模块中的符号会冲突,这会导致 PostgreSQL 服务器进程的崩溃。在一个会话中有一个检查来阻止混淆 Python 的主版本,如果检测到不匹配会中断会话。不过,可以在同一个数据库中对不同的会话使用两种 PL/Python 变体。