pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
目录
PL/Python 过程语言允许用 Python 语言编写 PostgreSQL 函数。
要在特定数据库中安装 PL/Python,可使用CREATE EXTENSION plpythonu,或者从 shell 命令行使用createlang plpythonu (另见第 42.1 节)。dbname
如果把某种语言安装到template1中,之后创建的所有数据库都会自动安装该语言。
从 PostgreSQL 7.4 开始,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 使用下面的命名和过渡方案来避免混用它们:
The PostgreSQL language named plpython2u implements PL/Python based on the Python 2 language variant.
PostgreSQL 中名为 plpython3u 的语言实现基于 Python 3 语言变体的 PL/Python。
名为 plpythonu 的语言实现基于默认 Python 语言变体(目前是 Python 2)的 PL/Python。(这个默认与任何本地 Python 安装自己认为的“默认”无关,例如 /usr/bin/python 是什么。)取决于 Python 社区向 Python 3 迁移的进度,这个默认在 PostgreSQL 较远的将来版本中可能会被改为 Python 3。
It depends on the build configuration or the installed packages whether PL/Python for Python 2 or Python 3 or both are available.
所构建的变体取决于安装时找到的 Python 版本,或使用PYTHON环境变量显式设置的版本;请参见第 15.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 的更多信息,也可参见文档 Python 3.0 的新变化。
不允许在同一个会话中同时使用基于 Python 2 和基于 Python 3 的 PL/Python,因为动态模块中的符号会冲突,可能导致 PostgreSQL 服务器进程崩溃。系统会检查同一会话是否混用了不同的 Python 大版本,如果发现不匹配,就会中止会话。不过,可以在同一数据库的不同会话中分别使用这两种 PL/Python。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。