आप पीएल/पायथन संग्रहीत प्रक्रिया या ट्रिगर में किसी भी पायथन लाइब्रेरी का बहुत अधिक उपयोग कर सकते हैं।
देखें PL/Python दस्तावेज़ ।
अवधारणाएं
समझने की महत्वपूर्ण बात यह है कि PL/पायथन है सीपीथन (PostgreSQL में 9.3 तक और वैसे भी); यह ठीक उसी दुभाषिया का उपयोग करता है जो सामान्य स्टैंडअलोन पायथन करता है, यह इसे केवल PostgreSQL समर्थित पुस्तकालय में एक पुस्तकालय के रूप में लोड करता है। कुछ सीमाओं के साथ (नीचे उल्लिखित), अगर यह CPython के साथ काम करता है तो यह PL/Python के साथ काम करता है।
यदि आपके सिस्टम पर कई पायथन दुभाषिए स्थापित हैं - संस्करण, वितरण, 32-बिट बनाम 64-बिट आदि - तो आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि आप डिस्टुटिल्स स्क्रिप्ट आदि चलाते समय एक्सटेंशन और लाइब्रेरी को सही में स्थापित कर रहे हैं, लेकिन वह है इसके बारे में।
चूंकि आप सिस्टम पायथन के लिए उपलब्ध किसी भी पुस्तकालय को लोड कर सकते हैं, यह सोचने का कोई कारण नहीं है कि एनएलटीके एक समस्या होगी जब तक कि आप नहीं जानते कि इसे थ्रेडिंग जैसी चीजों की आवश्यकता होती है जो वास्तव में पोस्टग्रेएसक्यूएल बैकएंड में अनुशंसित नहीं हैं। (निश्चित रूप से, मैंने इसे आजमाया और यह "बस काम किया", नीचे देखें)।
एक संभावित चिंता यह है कि एनएलटीके जैसी किसी चीज का स्टार्टअप ओवरहेड काफी बड़ा हो सकता है, आप शायद इसे पोस्टमास्टर में पीएल/पायथन प्रीलोड करना चाहते हैं और मॉड्यूल को अपने सेटअप कोड में आयात करना चाहते हैं ताकि बैकएंड शुरू होने पर यह तैयार हो। समझें कि पोस्टमास्टर मूल प्रक्रिया है कि अन्य सभी बैकएंड fork()
से, इसलिए यदि पोस्टमास्टर कुछ प्रीलोड करता है तो यह बैकएंड के लिए बहुत कम ओवरहेड्स के साथ उपलब्ध है। किसी भी तरह से प्रदर्शन का परीक्षण करें।
सुरक्षा
क्योंकि आप पीएल/पायथन के माध्यम से मनमाने ढंग से सी पुस्तकालयों को लोड कर सकते हैं और क्योंकि पायथन दुभाषिया के पास कोई वास्तविक सुरक्षा मॉडल नहीं है, plpythonu
एक "अविश्वसनीय" भाषा है। स्क्रिप्ट के पास postgres
. के रूप में सिस्टम तक पूर्ण और अप्रतिबंधित पहुंच होती है user और PostgreSQL में एक्सेस कंट्रोल को काफी सरलता से बायपास कर सकता है। स्पष्ट सुरक्षा कारणों से इसका मतलब है कि पीएल/पायथन फ़ंक्शन और ट्रिगर केवल सुपरयूज़र द्वारा बनाए जा सकते हैं, हालांकि यह GRANT
के लिए काफी उचित है। सामान्य उपयोगकर्ता चलाने . की क्षमता रखते हैं सुपरयुसर द्वारा स्थापित किए गए सावधानीपूर्वक लिखित कार्य।
उल्टा यह है कि आप सामान्य पायथन में बहुत कुछ कर सकते हैं, यह ध्यान में रखते हुए कि पायथन दुभाषिया का जीवनकाल डेटाबेस कनेक्शन (सत्र) का है। थ्रेडिंग की अनुशंसा नहीं की जाती है, लेकिन अधिकांश अन्य चीजें ठीक हैं।
पीएल/पायथन कार्यों को सावधानीपूर्वक इनपुट स्वच्छता के साथ लिखा जाना चाहिए, search_path
. सेट करना होगा प्रश्नों आदि को चलाने के लिए SPI का आह्वान करते समय। इस पर मैनुअल में अधिक चर्चा की गई है।
सीमाएं
लंबे समय से चल रही या संभावित रूप से समस्याग्रस्त चीजें जैसे डीएनएस लुकअप, रिमोट सिस्टम से एचटीटीपी कनेक्शन, एसएमटीपी मेल डिलीवरी, आदि को आमतौर पर LISTEN
का उपयोग करके एक सहायक स्क्रिप्ट से किया जाना चाहिए। और NOTIFY
PostgreSQL के प्रदर्शन को बनाए रखने और VACUUM
में बाधा डालने से बचने के लिए इन-बैकएंड जॉब के बजाय बहुत सारे लंबे लेनदेन के साथ। आप इन चीजों को बैकएंड में कर सकते हैं, यह एक अच्छा विचार नहीं है।
आपको PostgreSQL बैकएंड में थ्रेड बनाने से बचना चाहिए।
किसी भी पायथन पुस्तकालय को लोड करने का प्रयास न करें जो libpq
को लोड करेगा सी पुस्तकालय। यह बैकएंड के साथ सभी प्रकार की रोमांचक समस्याओं का कारण बन सकता है। PL/Python से PostgreSQL से बात करते समय SPI रूटीन का उपयोग करें, न कि नियमित क्लाइंट लाइब्रेरी का।
बैकएंड में बहुत लंबे समय तक चलने वाली चीजें न करें, इससे वैक्यूम की समस्या हो सकती है।
कुछ भी लोड न करें जो पहले से लोड की गई देशी सी लाइब्रेरी का एक अलग संस्करण लोड कर सकता है - एक अलग 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 के लिए उपयोग कर रहा है, तब तक nltk की निर्भरताएं स्थापित हैं, यह ठीक काम करेगा।
नोट
PL/Python CPython है, लेकिन मुझे एक PyPy आधारित विकल्प देखना अच्छा लगेगा जो PyPy की सैंडबॉक्स सुविधाओं का उपयोग करके अविश्वसनीय कोड चला सकता है।