はじめに
Pythonは、chainerやtensorflowなどの分析パッケージが公開され、ますますデータ分析ツールとして注目を集めています。
そんなPythonをPostgreSQLのファンクション実装言語として利用できる機能に「PL/Python」というものがあります。
デフォルトでPL/PythonはシステムのPythonを使ってしまいます。
一方でシステムのPythonを汚したくない場合などでは、pyenvでPython環境を分離して分析パッケージを入れる場合がありそうです。
そこで、PL/Pythonの実行環境に、pyenvでインストールしたPythonを使う方法を調べました。
1. pyenvでのPythonインストール
PL/Pythonはlibpython~~.soを参照します。
通常のpyenv installでは共有ライブラリはインストールされないので
以下のようにします。
CONFIGURE_OPTS="--enable-shared" pyenv install 2.7.10
これでpyenv側はOK
2. PostgreSQLでのPL/Pythonコンパイル
PostgreSQLはソースからコンパイルします。
https://github.com/postgres/postgres
ここから、git cloneすればいいと思います。
そして、configureで以下のようにします。
./configure --prefix=/home/user/pgsql/pgsql9_5 --with-python=yes PYTHON=/home/user/.pyenv/versions/2.7.10/bin/python
--prefixはつけてもつけなくてもいいです。
重要なのが
--with-python=yes
と
PYTHON=/home/user/.pyenv/versions/2.7.10/bin/python
--with-python=yesはつけないと、そもそもPL/Pythonがコンパイルされません。
PYTHON=/home/user/.pyenv/versions/2.7.10/bin/pythonはpyenvでインストールした
Pythonバイナリの場所を指定します。
するとpyenvのPythonを利用するようにPL/Pythonがコンパイルされます。
configureを実行すると、生成されるMakefile.globalに以下の記述がされます。
python_includespec  = -I/home/user/.pyenv/versions/2.7.10/include/python2.7
python_libdir       = /home/user/.pyenv/versions/2.7.10/lib
python_libspec      = -L/home/user/.pyenv/versions/2.7.10/lib -lpython2.7
※記述の先がpyenvのパスになっていなかったら直します。
あとは、PostgreSQLをmake; make installすればPL/Pythonの実行環境がpyenvでインストールされたPythonとなっています。
補足
PostgreSQLごとコンパイルしたが、本来はPL/Pythonのみコンパイルしてもいいはず?