Chapter 38. PL/Python - 過程語言

Table of Contents
38.1. PL/Python 函數
38.2. 觸發器函數
38.3. 資料庫訪問

PL/Python 過程語言允許用 Python 語言寫 PostgreSQL 函數。

要在特定資料庫裡安裝 PL/Python,使用 createlang plpython dbname

提示: 如果一門語言安裝到了 template1 裡面, 那麼所有隨後建立的資料庫都會自動安裝該語言。

PostgreSQL 7.4 為止,PL/Python 只能當作一種"不可信任的"語言 (意思是它沒有提供任何限制用戶可為與不可為的手段)。因此,它被重新命名為 plpythonu。 可信任的 plpython 可能在將來的某個時間能夠獲得,條件是在 Python 裡開發出了新的安全執行機制。

注意: 使用源碼包的用戶必須在安裝過程中聲明打開 PL/Python 的製作。 (請參考安裝教學獲取更多訊息。)二進制包的用戶可能會在獨立的子包中找到 PL/Python。

38.1. PL/Python 函數

PL/Python 寫的函數用通常的方法聲明。比如:

CREATE FUNCTION myfunc(text) RETURNS text
	AS 'return args[0]'
LANGUAGE plpython;

以函數體形式給出的 Python 轉換成 Python 函數。比如,上面的轉換成

def __plpython_procedure_myfunc_23456():
	return args[0]

這裡假設 23456 是 PostgreSQL 賦予這個函數的 OID。

如果您沒有提供返回數值,Python 返回預設的 NonePL/Python 把 Python 的None 轉換成 SQL 的空值。

PostgreSQL函數變量可以透過全局的 args 列資料表獲取. 在 myfunc 例子裡, args[0] 包含當做文本參數傳遞的數值。對於 myfunc2(text, integer)args[0] 將包含 text 參數和整數變量 args[1]

全局字典SD可以用於在函數調用中間儲存資料。 這個變量是私有靜態資料。全局字典GD是公共資料, 可以在一個後端裡的所有 python 函數之間使用。用時小心。

每個函數都在 Python 解釋器裡獲得自己的受限制的執行對象, 因此來自 myfunc 的全局資料很函數參數是 myfunc2 所看不到的。 這裡的例外是我們上面提到的GD字典。