codecamp

PostgreSQL Python 2 vs. 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 还是 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 的操作系统环境的冒险者们,可以更改的扩展控制和脚本文件的内容, 让plpythonu等价于plpython3u, 记住这将会让他们的安装与世界的其他大部分东西都不兼容。

有关移植到 Python 3 的更多信息还可见文档What's New In Python 3.0

不允许在同一个会话中使用基于 Python 2 的 PL/Python 以及基于 Python 3 的 PL/Python,因为动态模块中的符号会冲突,这会导致 PostgreSQL 服务器进程的崩溃。在一个会话中有一个检查来阻止混淆 Python 的主版本,如果检测到不匹配会中断会话。不过,可以在同一个数据库中对不同的会话使用两种 PL/Python 变体。


PostgreSQL PL/Python — Python 过程语言
PostgreSQL PL/Python 函数
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

PostgreSQL SQL语言

PostgreSQL 服务器管理

PostgreSQL 客户端接口

PostgreSQL 服务器编程

PostgreSQL 参考

PostgreSQL 内部

PostgreSQL 附录

PostgreSQL 参考书目

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }