PostgreSQL: 如何安装 plpythonu 扩展
PostgreSQL: 如何安装 plpythonu 扩展
我在Ubuntu 12.04.4上运行PostgreSQL 9.3.1。我想要使用plpython语言扩展,但是当我尝试使用它时出现错误:
错误:语言“plpythonu”不存在
当我尝试创建扩展时:
CREATE EXTENSION plpythonu
我得到错误:无法访问文件“$libdir/plpython2”:没有该文件或目录
经过搜索和阅读博客文章,我尝试安装额外的软件包,并将所有plpython文件从/usr/share/postgresql/9.1/extension复制到PostgreSQL似乎正在寻找它们的/opt/bitnami/postgresql/share/extension。至少这让我能够让PostgreSQL看到可用的扩展。当我运行:
SELECT name, default_version, installed_version FROM pg_available_extensions WHERE name LIKE('plpy*')
我得到:
name | default_version | installed_version ------------+-----------------+------------------- plpython2u | 1.0 | plpython3u | 1.0 | plpythonu | 1.0 |
我仍然看不到我可以在/opt/bitnami/postgresql/lib
中的plpython库。有人可以帮助我完成剩余的步骤使扩展正常工作吗?提前谢谢!
问题出现的原因是在升级旧数据库至PG11或PG12时,plpythonu函数也需要将语言从plpythonu改为plpython3u。解决方法是安装postgresql-contrib扩展。
在基于Debian的postgres 11.2上,需要执行以下命令来安装plpythonu扩展:
apt-get update && apt-get install postgresql-plpython3-11
在pg 12和Ubuntu 18上,可以使用以下命令来安装plpythonu扩展:
apt install postgresql-plpython3-12
然而,在执行SQL语句CREATE EXTENSION plpythonu;
时会出现错误:
ERROR: could not open extension control file "/usr/share/postgresql/12/extension/plpythonu.control": No such file or directory
此时可以尝试使用CREATE EXTENSION plpython3u
替代。
另外,可以尝试运行以下代码来确认CREATE EXTENSION plpython3u
和CREATE OR REPLACE FUNCTION return_version() RETURNS VARCHAR AS $$ import sys return sys.version $$ LANGUAGE plpython3u;
是否正常工作:
CREATE OR REPLACE FUNCTION return_version() RETURNS VARCHAR AS $$ import sys return sys.version $$ LANGUAGE plpython3u;
需要注意的是,这种方法在Windows上可能无效。
如果在执行sudo apt-get update && apt-get install postgresql-plpython3-13
时遇到以下错误:
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
可以通过安装postgresql-contrib扩展来解决该问题。
问题:如何在PostgreSQL上安装plpythonu扩展?
原因:在Raspbian 10 (buster) / Linux raspberrypi 4.19.97-v7+ #1294上安装PL/Python 3的过程中,出现了连接错误。
解决方法:
1. 使用以下命令查找可安装的版本:
pi:~/$ sudo apt-cache search ".*plpython3.*" postgresql-plpython3-11 - PL/Python 3 procedural language for PostgreSQL 11
2. 使用以下命令安装扩展:
sudo apt-get install postgresql-contrib postgresql-plpython3-11
3. 使用以下命令启动PostgreSQL服务:
sudo systemctl start postgresql
或者使用以下命令将其设置为开机自启动:
sudo systemctl enable postgresql
4. 使用以下命令切换到postgres用户:
sudo su - postgres
5. 进入psql命令行:
psql
6. 使用以下命令创建扩展:
CREATE EXTENSION plpython3u;
7. 使用以下命令验证扩展是否安装成功:
select * from pg_language;
以上解决方法可以确保`CREATE EXTENSION plpython3u`和`select * from pg_language`正常工作。如果还需要运行以下命令:
CREATE OR REPLACE FUNCTION return_version() RETURNS VARCHAR AS $$ import sys return sys.version $$ LANGUAGE plpython3u;
请注意,该命令在Windows上不起作用。更多信息请参考PostgreSQL 13 + Python 3.7.9 + plpython3u: 'psql: server closed the connection unexepectedly.' + 'The application has lost the database connection.'。
经确认,以上命令可以正常工作。创建函数后,可以运行`SELECT return_version();`命令来获取输出结果:
return_version ------------------------------------------ 3.8.10 (default, Jun 2 2021, 10:49:15) + [GCC 9.4.0] (1 row)
然而,尚未找到一种方法来导入还未安装的Python包。如果您知道如何解决这个问题,请提供答案。更多信息请参考Linux: How to install a Python package so that it is found by the already working PostgreSQL 13 plpython3u extension?。
问题的原因是使用的是Bitnami提供的PostgreSQL软件包,而不是Ubuntu的postgresql软件包。因此,安装postgresql-plpython扩展无法为实际使用的PostgreSQL软件包提供PL/Python支持。解决方法是使用与安装Bitnami PostgreSQL时相同的方法添加PL/Python支持,或者使用建议的来自http://apt.postgresql.org/的软件包。根据Bitnami社区的回答,他们目前还不支持PL/Python扩展。对于Ubuntu 18 LTS,需要使用适当的postgresql-plpython软件包,并且还需要考虑选择python3。关于找不到"/usr/share/postgresql/12/extension/plpythonu.control"的问题,建议提出新的问题来解决。