31

我需要在我的 pl/python 函数中导入第 3 方模块。似乎 pl/python 使用了一个没有任何 3rd 方模块的内部 python。

我收到这种错误:

ERROR:  PL/Python: PL/Python function "to_tsvector_luc" failed
DETAIL:  <type 'exceptions.ImportError'>: No module named lucene

********** Error **********

ERROR: PL/Python: PL/Python function "to_tsvector_luc" failed
SQL state: XX000
Detail: <type 'exceptions.ImportError'>: No module named lucene

如何将模块安装到 pl/python 中,以便可以从存储过程代码中导入它?

4

4 回答 4

26

pl/python 可以访问普通 Python 解释器将拥有的所有模块,只要它们位于$PYTHONPATH服务器上(以及运行 postgres 服务的用户)。import lucene如果您在服务器上的 Python 解释器中运行它可以工作吗?

如果您的模块安装在其他地方(例如不是 dist-packages 等),那么您需要/etc/postgresql/9.1/main/environment在服务器上编辑您的(调整到您的 PostgreSQL 版本)文件并添加类似PYTHONPATH='<path to your module>'.

于 2011-11-07T11:50:39.760 回答
18

由于修改 postgres 用户的 PYTHONPATH 可能需要重新启动服务器,因此从 Python 中添加路径会更容易一些,通过

from sys import path
path.append( '/path/to/your/module' )
于 2013-10-30T23:28:07.467 回答
4

对我来说,这是关于知道 Python Postgres 正在查看哪个版本,然后安装到 /local/lib 目录,而不是 Postgres 无法识别的 .local 目录。

在 Postgres 中,创建了这个函数来识别它正在使用的 Python 版本:.

CREATE OR REPLACE FUNCTION python_version()
    RETURNS pg_catalog.text AS $BODY$

    import sys
    plpy.info(sys.version)    
    return 'finish'
    $BODY$
LANGUAGE plpython3u VOLATILE SECURITY DEFINER

使用以下函数执行函数:

select python_version()

在 Python 中:

import sys
sys.version

脚本和 Python 都表示: INFO: 3.7.3 (default, Aug 20 2019, 17:04:43)

pip3 install 把库放到这个目录:/home/username/.local/lib/python3.7/site-packages

使所有用户(包括 Postgres)都可以使用该软件包。我用过umask:

sudo su
cd ~
umask 022
pip3 install <package name>

注意:软件包安装在:/usr/local/lib# cd python3.7/dist-packages 不在 /usr/lib/python3/dist-packages#

于 2019-10-08T09:33:27.350 回答
0

I think the 43 pl/python has access to the all the modules that the normal Python interpreter would have as long as they are in the Pythonpath on the server and user that is using PostgreSQL.

If your module is installed somewhere else (e.g. packages), then you would need to edit your /src/postgresql/9.1/main/environment (adjust to your PostgreSQL version) file on the server and add something like Pythonpath=>*'path to your module'**.

于 2021-11-08T10:22:53.700 回答