PostgreSQL PL / Python: вызов хранимой процедуры в virtualenv - PullRequest
3 голосов
/ 06 марта 2012

Когда я вызываю хранимую процедуру PostgreSQL PL / Python в моем приложении Python, она, кажется, выполняется в отдельном процессе, работающем как пользователь postgres.До сих пор это имело только побочный эффект, что я должен был сделать свой лог-файл доступным для записи как для себя, так и для пользователя базы данных, поэтому приложение и хранимая процедура могут писать в него.

Теперь, однако, я начал использовать virtualenv и добавил ряд файлов .pth в мою папку ~/.virtualenvs/virt_env/lib/python2.7/site-packages/, которые добавляют пути к моим модулям в путь Python.

Когда хранимая процедура выполняется, пользователь postgres не находится в той же виртуальной среде, что и я, поэтому хранимая процедура не находит мои модули.Я могу изменить PYTHONPATH в глобальной среде PostgreSQL , но мне нужно изменить это каждый раз, когда я переключаю виртуальные среды - что является своего рода противоречием цели virtualenv ...

Как можноЛи я расширить путь Python для хранимых процедур?

ОБНОВЛЕНИЕ :

A был задан похожий вопрос , и существует разрешение изменить PYTHONPATHпеременная окружения в Postgres;однако, похоже, что не существует стандартного способа указания переменных среды для PostgreSQL ;по крайней мере, это не жизнеспособное решение для Mac OSX.

Ответы [ 2 ]

3 голосов
/ 22 июля 2014

Существует способ сделать это, как оказалось. Начиная с версии 1.6 или около того, virtualenv поставляется со скриптом activate_this.py, который можно использовать для настройки существующего интерпретатора для доступа к этому конкретному virtualenv.

exec(open('/Some/VirtualEnv/Directory/myvirtualenv/bin/activate_this.py').read(), 
dict(__file__='/Some/VirtualEnv/Directory/myvirtualenv/bin/activate_this.py'))

А в качестве полностью реализованной функции plpython:

CREATE OR REPLACE FUNCTION workon(venv text)
  RETURNS void AS
$BODY$
    import os
    import sys

    if sys.platform in ('win32', 'win64', 'cygwin'):
        activate_this = os.path.join(venv, 'Scripts', 'activate_this.py')
    else:
        if not os.environ.has_key('PATH'):
            import subprocess
            p=subprocess.Popen('echo -n $PATH', stdout=subprocess.PIPE, shell=True)
            (mypath,err) = p.communicate()
            os.environ['PATH'] = mypath

        activate_this = os.path.join(venv, 'bin', 'activate_this.py')

    exec(open(activate_this).read(), dict(__file__=activate_this))
$BODY$
LANGUAGE plpythonu VOLATILE

(Требуется дополнительная утилита PATH, поскольку по умолчанию PATH недоступна в plpython os.environ - В файле activ_this.py зафиксировано исправление, исправленное в , которое должно обновляться с выпуском следующей точки (должно быть 1.11.7 или 1.12)

(взято в основном из https://gist.github.com/dmckeone/69334e2d8b27f586414a)

2 голосов
/ 06 марта 2012

Обычно я бы сказал, что это не очень хорошая идея, но вы, возможно, сможете ответить на этот вопрос .

Что вы можете сделать, это запустить несколько экземпляров PostgreSQL в разных средах, чтобы учесть различные настройки PYTHONPATH.

...