Bạn có thể sử dụng khá nhiều thư viện Python trong một thủ tục hoặc trình kích hoạt được lưu trữ PL / Python.
Xem tài liệu PL / Python .
Các khái niệm
Điểm quan trọng cần hiểu là PL / Python là CPython (trong PostgreSQL lên đến và bao gồm 9.3, dù sao); nó sử dụng chính xác cùng một trình thông dịch mà Python độc lập bình thường làm, nó chỉ tải nó như một thư viện vào PostgreSQL được hỗ trợ. Với một số hạn chế (được nêu bên dưới), nếu nó hoạt động với CPython thì nó sẽ hoạt động với PL / Python.
Nếu bạn đã cài đặt nhiều trình thông dịch Python trên hệ thống của mình - các phiên bản, bản phân phối, 32 bit so với 64 bit, v.v. - bạn có thể cần đảm bảo rằng bạn đang cài đặt các tiện ích mở rộng và thư viện thành đúng khi chạy các tập lệnh distutils, v.v., nhưng đó là về nó.
Vì bạn có thể tải bất kỳ thư viện nào có sẵn cho hệ thống nên Python không có lý do gì để nghĩ rằng NLTK sẽ là một vấn đề trừ khi bạn biết rằng nó yêu cầu những thứ như phân luồng không thực sự được khuyến nghị trong phần phụ trợ PostgreSQL. (Chắc chắn rồi, tôi đã thử và nó "chỉ hoạt động", xem bên dưới).
Một mối quan tâm có thể xảy ra là chi phí khởi động của một cái gì đó như NLTK có thể khá lớn, bạn có thể muốn tải trước PL / Python nó trong quản trị viên bưu điện và nhập mô-đun trong mã thiết lập của bạn để nó sẵn sàng khi chương trình phụ trợ bắt đầu. Hiểu rằng quản trị viên bưu điện là quy trình mẹ mà tất cả các phụ trợ khác fork()
từ, vì vậy nếu người quản lý bưu điện tải trước một cái gì đó, nó sẽ có sẵn cho các phụ trợ với chi phí giảm đáng kể. Kiểm tra hiệu suất theo cả hai cách.
Bảo mật
Vì bạn có thể tải các thư viện C tùy ý qua PL / Python và vì trình thông dịch Python không có mô hình bảo mật thực, plpythonu
là một ngôn ngữ "không đáng tin cậy". Tập lệnh có quyền truy cập đầy đủ và không hạn chế vào hệ thống dưới dạng postgres
người dùng và khá đơn giản có thể bỏ qua các kiểm soát truy cập trong PostgreSQL. Vì lý do bảo mật rõ ràng, điều này có nghĩa là các hàm và trình kích hoạt PL / Python chỉ có thể được tạo bởi superuser, mặc dù nó khá hợp lý với GRANT
người dùng bình thường có khả năng chạy các chức năng được viết cẩn thận đã được cài đặt bởi superuser.
Ưu điểm là bạn có thể làm khá nhiều thứ bạn có thể làm bằng Python bình thường, hãy nhớ rằng thời gian tồn tại của trình thông dịch Python là thời gian tồn tại của kết nối cơ sở dữ liệu (phiên). Phân luồng không được khuyến khích, nhưng hầu hết những thứ khác đều ổn.
Các hàm PL / Python phải được viết với sự vệ sinh đầu vào cẩn thận, phải đặt search_path
khi gọi SPI để chạy các truy vấn, v.v. Điều này sẽ được thảo luận nhiều hơn trong sách hướng dẫn.
Hạn chế
Những thứ hoạt động lâu dài hoặc có khả năng có vấn đề như tra cứu DNS, kết nối HTTP với hệ thống từ xa, gửi thư SMTP, v.v. thường phải được thực hiện từ tập lệnh trình trợ giúp bằng cách sử dụng LISTEN
và NOTIFY
chứ không phải là một công việc phụ trợ để duy trì hiệu suất của PostgreSQL và tránh gây trở ngại cho VACUUM
với nhiều giao dịch dài. Bạn có thể làm những điều này trong chương trình phụ trợ, đó không phải là một ý tưởng tuyệt vời.
Bạn nên tránh tạo các chuỗi trong phần phụ trợ PostgreSQL.
Đừng cố tải bất kỳ thư viện Python nào sẽ tải libpq
Thư viện C. Điều này có thể gây ra tất cả các loại vấn đề thú vị với phần phụ trợ. Khi nói chuyện với PostgreSQL từ PL / Python, hãy sử dụng các quy trình SPI không phải là thư viện máy khách thông thường.
Đừng làm những việc quá dài trong chương trình phụ trợ, bạn sẽ gây ra các vấn đề về chân không.
Không tải bất kỳ thứ gì có thể tải một phiên bản khác của thư viện C gốc đã được tải - giả sử một libcrypto, libssl khác, v.v.
Không ghi trực tiếp vào các tệp trong thư mục dữ liệu PostgreSQL, đã từng .
Các hàm PL / Python chạy dưới dạng postgres
người dùng hệ thống trên OS, vì vậy họ không có quyền truy cập vào những thứ như thư mục chính của người dùng hoặc các tệp ở phía máy khách của kết nối.
Kết quả kiểm tra
$ 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)
Vì vậy, như tôi đã nói:Hãy thử nó. Miễn là trình thông dịch Python mà PostgreSQL đang sử dụng cho plpython có cài đặt các phụ thuộc của nltk thì nó sẽ hoạt động tốt.
Lưu ý
PL / Python là CPython, nhưng tôi muốn thấy một giải pháp thay thế dựa trên PyPy có thể chạy mã không đáng tin cậy bằng cách sử dụng các tính năng hộp cát của PyPy.