PL/PythonストアドプロシージャまたはトリガーでほぼすべてのPythonライブラリを使用できます。
PL/Pythonのドキュメント を参照してください。 。
コンセプト
理解しておくべき重要なポイントは、 PL / Python であるということです。 CPython (とにかく、9.3までのPostgreSQLでは);通常のスタンドアロンPythonとまったく同じインタープリターを使用し、ライブラリとしてPostgreSQLにバックアップされているだけです。いくつかの制限がありますが(以下に概説)、CPythonで動作する場合は、PL/Pythonで動作します。
システムに複数のPythonインタープリター(バージョン、ディストリビューション、32ビットと64ビットなど)がインストールされている場合、distutilsスクリプトなどを実行するときに、拡張機能とライブラリを正しいものにインストールしていることを確認する必要がありますが、それはそれについて。
システムPythonで利用可能な任意のライブラリをロードできるため、PostgreSQLバックエンドで実際には推奨されていないスレッド化などが必要であることがわかっていない限り、NLTKが問題になると考える理由はありません。 (案の定、私はそれを試しましたが、「うまくいきました」。以下を参照してください。)
考えられる懸念の1つは、NLTKのようなものの起動オーバーヘッドが非常に大きい可能性があることです。おそらく、ポストマスターにPL / Pythonをプリロードし、セットアップコードにモジュールをインポートして、バックエンドの起動時に準備ができるようにします。ポストマスターは、他のすべてのバックエンドfork()
の親プロセスであることを理解してください したがって、ポストマスターが何かをプリロードすると、オーバーヘッドが大幅に削減されてバックエンドで利用できるようになります。いずれかの方法でパフォーマンスをテストします。
セキュリティ
PL / Pythonを介して任意のCライブラリをロードでき、Pythonインタープリターには実際のセキュリティモデルがないため、plpythonu
「信頼できない」言語です。スクリプトは、postgres
として、システムへの完全かつ無制限のアクセス権を持っています。 ユーザーであり、PostgreSQLのアクセス制御をかなり簡単にバイパスできます。明らかなセキュリティ上の理由から、これはPL / Python関数とトリガーがスーパーユーザーによってのみ作成される可能性があることを意味しますが、GRANT
することは非常に合理的です。 通常のユーザーは実行することができます スーパーユーザーによってインストールされた慎重に記述された関数。
利点は、Pythonインタープリターの存続期間がデータベース接続(セッション)の存続期間であることを念頭に置いて、通常のPythonで実行できるほとんどすべてのことを実行できることです。スレッド化はお勧めしませんが、他のほとんどのことは問題ありません。
PL / Python関数は、慎重な入力サニタイズを使用して作成する必要があり、search_path
を設定する必要があります SPIを呼び出してクエリなどを実行する場合。これについては、マニュアルで詳しく説明しています。
制限
DNSルックアップ、リモートシステムへのHTTP接続、SMTPメール配信などの長時間実行または潜在的に問題のあることは、通常、LISTEN
を使用してヘルパースクリプトから実行する必要があります。 およびNOTIFY
PostgreSQLのパフォーマンスを維持し、VACUUM
の妨げにならないようにするために、バックエンドジョブではなく 長いトランザクションがたくさんあります。これらのことはバックエンドで行うことができますが、それは良い考えではありません。
PostgreSQLバックエンド内にスレッドを作成することは避けてください。
libpq
をロードするPythonライブラリをロードしようとしないでください Cライブラリ。これにより、バックエンドであらゆる種類のエキサイティングな問題が発生する可能性があります。 PL / PythonからPostgreSQLと通信するときは、通常のクライアントライブラリではなくSPIルーチンを使用してください。
バックエンドで非常に長時間実行することを行わないでください。バキュームの問題が発生します。
すでにロードされているネイティブCライブラリの異なるバージョンをロードする可能性のあるものはロードしないでください。たとえば、別のlibcrypto、libsslなどです。
PostgreSQLデータディレクトリ内のファイルに直接書き込むことは絶対にしないでください。 。
PL/Python関数はpostgres
として実行されます OS上のシステムユーザーであるため、ユーザーのホームディレクトリや接続のクライアント側のファイルなどにアクセスすることはできません。
テスト結果
$ yum install python-nltk python-nltk
$ psql -U postgres regress
regress=# CREATE LANGUAGE plpythonu;
regress=# CREATE OR REPLACE FUNCTION nltk_word_tokenize(word text) RETURNS text[] AS $$
import nltk
return nltk.word_tokenize(word)
$$ LANGUAGE plpythonu;
regress=# SELECT nltk_word_tokenize('This is a test, it''s going to work fine');
nltk_word_tokenize
-----------------------------------------------
{This,is,a,test,",",it,'s,going,to,work,fine}
(1 row)
だから、私が言ったように:それを試してみてください。 PostgreSQLがplpythonに使用しているPythonインタープリターにnltkの依存関係がインストールされている限り、正常に機能します。
注
PL / PythonはCPythonですが、PyPyのサンドボックス機能を使用して信頼できないコードを実行できるPyPyベースの代替手段が欲しいです。