postgresql 如何安装postgres pl/python的第三方模块?

gjmwrych  于 2023-05-17  发布在  PostgreSQL
关注(0)|答案(5)|浏览(214)

我需要在我的pl/python函数中导入一个第三方模块。似乎pl/python使用了一个内部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中,以便可以从存储过程代码中导入它?

i86rm4rw

i86rm4rw1#

pl/python可以访问普通Python解释器拥有的所有模块,只要它们位于服务器上的$PYTHONPATH中(以及运行postgres服务的用户)。如果在服务器上的Python解释器中运行import lucene,它能工作吗?
如果您的模块安装在其他地方(例如不是dist-packages等),那么你需要在服务器上编辑你的/etc/postgresql/9.1/main/environment(调整到你的PostgreSQL版本)文件,并添加类似PYTHONPATH='<path to your module>'的东西。

elcex8rz

elcex8rz2#

由于修改postgres用户的PYTHONPATH可能需要重新启动服务器,因此在Python中通过

from sys import path
path.append( '/path/to/your/module' )
euoag5mw

euoag5mw3#

对我来说,这是关于知道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都说:信息:3.7.3(默认,2019年8月20日17:04:43)
pip 3 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#

13z8s7eq

13z8s7eq4#

我认为43 pl/python可以访问普通Python解释器所拥有的所有模块,只要它们位于使用PostgreSQL的服务器和用户的Pythonpath中。
如果您的模块安装在其他地方(例如包),那么你需要在服务器上编辑你的/src/postgresql/9.1/main/environment(调整到你的PostgreSQL版本)文件,并添加类似Pythonpath=>*'path to your module'**的内容。

doinxwow

doinxwow5#

对于Ubuntu 22.04:

  • 安装您的模块:sudo pip install foo .
  • 找出你的python存储已安装模块的位置。对我来说,它是/usr/local/lib/python3.10/dist-packages/-显然python3.10是你安装的python版本。如果您的路径不同,命令pip3 show <your package name here>应该可以帮助您。例如:pip3 show numpy
  • 现在,您需要更改模块文件的权限,因为postgres以postgres用户身份运行,但模块的文件将属于root。你应该做:sudo chmod -R 755 <path to your module>。例如:sudo chmod -R 755 /usr/local/lib/python3.10/dist-packages/test_module

现在你的模块应该可以工作了。

相关问题