3

PythonアプリケーションでPostgreSQLPL/ Pythonストアドプロシージャを呼び出すと、ユーザーとして実行されている別のプロセスで実行されているようpostgresです。これまでのところ、これには、自分自身とデータベースユーザーの両方がログファイルを書き込み可能にする必要があるという副作用しかありませんでした。そのため、アプリケーションとストアドプロシージャの両方がログファイルに書き込むことができます。

しかし今、私は使用を開始し、モジュールへのパスをPythonパスにvirtualenv追加するいくつかの.pthファイルをフォルダーに追加しました。~/.virtualenvs/virt_env/lib/python2.7/site-packages/

ストアドプロシージャが実行されると、ユーザーpostgresは私と同じ仮想環境にいないため、ストアドプロシージャは私のモジュールを見つけられません。グローバルPostgreSQL環境PYTHONPATHで変更できますが、仮想環境を切り替えるたびに変更する必要があります。これは、virtualenvの目的に反します...

ストアドプロシージャのPythonパスを拡張するにはどうすればよいですか?

更新

同様の質問があり、PostgresでPYTHONPATH環境変数を変更するという解決策がありました。ただし、PostgreSQLの環境変数を指定する標準的な方法はないようです。少なくとも、MacOSXでは実行可能なソリューションではありません。

4

2 に答える 2

3

結局のところ、それを行う方法があります。バージョン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がplpython os.environで利用できないため、追加のPATHマンガリーが必要です。activate_this.pyには、次のポイントリリース(1.11.7または1.12)でロールする修正がチェックインされています。

(主にhttps://gist.github.com/dmckeone/69334e2d8b27f586414aから取得)

于 2014-07-22T16:03:47.253 に答える
2

通常、それは本当に良い考えではないと思いますが、あなたはこの質問に従うことができるかもしれません。

できることは、さまざまなPYTHONPATH設定を可能にするために、さまざまな環境でPostgreSQLの複数のインスタンスを実行することです。

于 2012-03-06T16:18:24.330 に答える