Как установить сторонний модуль для postgres pl/python?
Мне нужно импортировать сторонний модуль внутри моей функции pl/python.
Кажется, pl/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, чтобы я мог импортировать его из моего кода хранимой процедуры?
Ответы
Ответ 1
pl/python имеет доступ ко всем модулям, которые должен иметь обычный интерпретатор Python, если они находятся в $PYTHONPATH
на сервере (и пользователь, который запускает службу postgres). Работает ли import lucene
, если вы запустили его в интерпретаторе Python на сервере?
Если ваш модуль установлен где-то в другом месте (например, не dist-packages и т.д.), вам нужно будет отредактировать файл /etc/postgresql/9.1/main/environment
(настроить на версию PostgreSQL) на сервере и добавить что-то вроде PYTHONPATH='<path to your module>'
.
Ответ 2
Поскольку для модификации PYTHONPATH пользователя postgres, скорее всего, потребуется перезагрузка сервера, несколько проще добавить путь из Python через
from sys import path
path.append( '/path/to/your/module' )
Ответ 3
Для меня это было о знании, какая версия Python Postgres была смотреть и затем устанавливать в каталог /local/lib и НЕ Каталог .local, который не распознается в Postgres.
В 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 (по умолчанию, 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/ Расс-пакеты #