Anda dapat menggunakan hampir semua pustaka Python dalam prosedur atau pemicu tersimpan PL/Python.
Lihat dokumentasi PL/Python .
Konsep
Poin penting untuk dipahami adalah bahwa PL/Python adalah CPython (dalam PostgreSQL hingga dan termasuk 9.3, bagaimanapun); ia menggunakan penerjemah yang persis sama dengan Python mandiri biasa, ia hanya memuatnya sebagai pustaka ke dalam dukungan PostgreSQL. Dengan beberapa batasan (diuraikan di bawah), jika berfungsi dengan CPython, ia berfungsi dengan PL/Python.
Jika Anda memiliki beberapa juru bahasa Python yang diinstal pada sistem Anda - versi, distribusi, 32-bit vs 64-bit dll - Anda mungkin perlu memastikan bahwa Anda menginstal ekstensi dan pustaka ke dalam yang benar saat menjalankan skrip distutils, dll, tapi itu tentang hal itu.
Karena Anda dapat memuat pustaka apa pun yang tersedia untuk sistem Python, tidak ada alasan untuk berpikir NLTK akan menjadi masalah kecuali Anda tahu itu memerlukan hal-hal seperti threading yang tidak benar-benar direkomendasikan di backend PostgreSQL. (Benar saja, saya mencobanya dan "berhasil", lihat di bawah).
Satu kekhawatiran yang mungkin adalah bahwa overhead startup dari sesuatu seperti NLTK mungkin cukup besar, Anda mungkin ingin memuat PL/Python di postmaster dan mengimpor modul dalam kode pengaturan Anda sehingga siap ketika backend dimulai. Pahami bahwa postmaster adalah proses induk yang semua backend lainnya fork()
dari, jadi jika postmaster memuat sesuatu, itu tersedia untuk backend dengan overhead yang sangat berkurang. Uji kinerja dengan cara apa pun.
Keamanan
Karena Anda dapat memuat pustaka C sewenang-wenang melalui PL/Python dan karena juru bahasa Python tidak memiliki model keamanan nyata, plpythonu
adalah bahasa yang "tidak dipercaya". Skrip memiliki akses penuh dan tidak terbatas ke sistem sebagai postgres
pengguna dan dapat dengan mudah melewati kontrol akses di PostgreSQL. Untuk alasan keamanan yang jelas, ini berarti bahwa fungsi dan pemicu PL/Python hanya dapat dibuat oleh pengguna super, meskipun cukup masuk akal untuk GRANT
pengguna normal kemampuan untuk berjalan fungsi yang ditulis dengan hati-hati yang diinstal oleh superuser.
Keuntungannya adalah Anda dapat melakukan hampir semua hal yang dapat Anda lakukan dengan Python normal, dengan mengingat bahwa masa pakai juru bahasa Python adalah dari koneksi database (sesi). Threading tidak disarankan, tetapi kebanyakan hal lain baik-baik saja.
Fungsi PL/Python harus ditulis dengan sanitasi input yang cermat, harus mengatur search_path
saat memanggil SPI untuk menjalankan kueri, dll. Ini dibahas lebih lanjut di manual.
Batasan
Hal-hal yang berjalan lama atau berpotensi bermasalah seperti pencarian DNS, koneksi HTTP ke sistem jarak jauh, pengiriman surat SMTP, dll umumnya harus dilakukan dari skrip pembantu menggunakan LISTEN
dan NOTIFY
daripada pekerjaan di-backend untuk mempertahankan kinerja PostgreSQL dan menghindari menghambat VACUUM
dengan banyak transaksi panjang. Anda dapat melakukan hal-hal ini di backend, itu bukan ide yang bagus.
Anda harus menghindari pembuatan utas di dalam backend PostgreSQL.
Jangan coba memuat pustaka Python apa pun yang akan memuat libpq
perpustakaan C. Ini dapat menyebabkan segala macam masalah menarik dengan backend. Saat berbicara dengan PostgreSQL dari PL/Python, gunakan rutinitas SPI bukan pustaka klien biasa.
Jangan melakukan hal-hal yang terlalu lama berjalan di backend, Anda akan menyebabkan masalah vakum.
Jangan memuat apa pun yang mungkin memuat versi berbeda dari pustaka C asli yang sudah dimuat - katakanlah libcrypto, libssl, dll yang berbeda.
Jangan menulis langsung ke file di direktori data PostgreSQL, sekali .
Fungsi PL/Python dijalankan sebagai postgres
pengguna sistem pada OS, sehingga mereka tidak memiliki akses ke hal-hal seperti direktori home pengguna atau file di sisi klien koneksi.
Hasil tes
$ 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)
Jadi, seperti yang saya katakan:Cobalah. Selama interpreter Python yang digunakan PostgreSQL untuk plpython telah menginstal dependensi nltk, itu akan berfungsi dengan baik.
Catatan
PL/Python adalah CPython, tetapi saya ingin melihat alternatif berbasis PyPy yang dapat menjalankan kode tidak tepercaya menggunakan fitur kotak pasir PyPy.