目录
PL/Python过程语言允许使用Python 语言编写PostgreSQL函数和过程。
要在特定数据库中安装 PL/Python,可使用CREATE EXTENSION plpythonu(另见Section 45.1)。
如果把某种语言安装到template1中,之后创建的所有数据库都会自动安装该语言。
PL/Python 只能作为一种“不受信任的”语言使用,这意味着它不提供任何机制来限制用户能在其中做什么,因此其名称为plpythonu。如果将来能在 Python 中开发出安全的执行机制,受信任的变体plpython可能会出现。使用不受信任的 PL/Python 编写函数时,函数编写者必须确保该函数不会被用来做任何不希望发生的事情,因为它能够做到任何以数据库管理员身份登录的用户所能做的事情。只有超级用户才能在plpythonu这类不受信任的语言中创建函数。
源码包用户必须在安装过程中专门启用 PL/Python 的构建(更多信息请参阅安装说明)。二进制包用户则可能会在单独的子包中找到 PL/Python。
PL/Python 同时支持 Python 2 和 Python 3 语言变体。(PostgreSQL 安装说明中可能包含有关所支持 Python 精确次版本号的更多信息。)由于 Python 2 和 Python 3 语言变体在一些重要方面不兼容,PL/Python 使用以下命名和过渡方案以避免混用:
PostgreSQL 中名为plpython2u的语言实现了基于 Python 2 语言变体的 PL/Python。
PostgreSQL 中名为plpython3u的语言实现了基于 Python 3 语言变体的 PL/Python。
名为plpythonu的语言实现了基于默认 Python 语言变体的 PL/Python,当前默认为 Python 2。(此默认值独立于任何本地 Python 安装可能认为的其“默认”版本,例如/usr/bin/python可能是哪个版本。)默认值将来可能会在较远的 PostgreSQL 版本中改为 Python 3,具体取决于 Python 社区向 Python 3 迁移的进展。
该方案类似于PEP 394中关于python命令命名和过渡的建议。
基于 Python 2 或 Python 3 的 PL/Python 是否可用(或者两者都可用),取决于构建配置或已安装的软件包。
所构建的变体取决于安装时找到的 Python 版本,或使用PYTHON环境变量显式设置的版本;请参见Section 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 的扩展控制文件和脚本文件,使 plpythonu 等同于 plpython3u,但要记住,这会使该安装环境与绝大多数其他环境不兼容。
有关迁移到 Python 3 的更多信息,也可参见文档 Python 3.0 的新变化。
不允许在同一个会话中同时使用基于 Python 2 和基于 Python 3 的 PL/Python,因为动态模块中的符号会冲突,可能导致 PostgreSQL 服务器进程崩溃。系统会检查同一会话是否混用了不同的 Python 大版本,如果发现不匹配,就会中止会话。不过,可以在同一数据库的不同会话中分别使用这两种 PL/Python。