| PostgreSQL 8.0.0 中文文件(轉譯自 PostgreSQL 中國 製作的簡體中文版本) | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 38. PL/Python - 過程語言 | Fast Forward | Next |
PL/Python 語言模塊自動輸入一個叫 plpy 的 Python 模塊。在這個模塊裡的函數和常量可以在您的 Python 代碼裡以 plpy.foo 的名字獲得。 目前,plpy 實現了函數 plpy.debug(msg), plpy.log(msg), plpy.info(msg), plpy.notice(msg), plpy.warning(msg), plpy.error(msg),和 plpy.fatal(msg)。 plpy.error 和 plpy.fatal 實際上拋出一個 Python 例外,如果您沒有捕獲這個例外,會傳播到調用的查詢, 導致目前交易或者子交易退出。 raise plpy.ERROR(msg) 和 raise plpy.FATAL(msg) 分別等效於調用 plpy.error 和 plpy.fatal。 其它函數只生成不同優先級的訊息。特定優先級的訊息是匯報給客戶端, 寫到伺服器日誌還是兩件事都做,是由 log_min_messages 和 client_min_messages 配置參數控制的。 參閱 Section 16.4 獲取更多訊息。
另外,plpy 模塊提供兩個函數,叫 execute 和 prepare。 拿一個查詢字串和一個可選的限制參數調用 plpy.execute 可以執行該查詢,並且結果返回到一個結果對像裡。 結果對像仿真一個列資料表或者一個字典對象。 結果對象可以透過行號和字串名來訪問。它有下面這些額外的方法: nrows() 返回該查詢返回的行數, 而 status 是 SPI_execute() 的返回變量。結果對象可能被修改。
比如:
rv = plpy.execute("SELECT * FROM my_table", 5)返回來自my_table中最多 5 行。如果my_table有一個my_column字串, 那麼您可以用下面的方法訪問它
foo = rv[i]["my_column"]
第二個函數,plpy.prepare,為一個查詢準備查詢規劃。 它是帶一個查詢字串和一個參數類型列資料表(如果您在該查詢裡有引用變量)調用的, 比如:
plan = plpy.prepare("SELECT last_name FROM my_users WHERE first_name = $1", [ "text" ])text是您將作為$1傳遞的變量的類型。 在準備一個語句之後,您用函數 plpy.execute 執行它。
rv = plpy.execute(plan, [ "name" ], 5)
第三個參數是限制,是可選的。
在您用 PL/Python 模塊準備一個計劃的時候,該計劃是自動保存的。 請閱讀 SPI 文件(Chapter 39)獲取這句話的含義。 為了能跨函數調用有效地使用這個特點,我們需要使用永久儲存字典 SD 或 GD 之一,(參閱 Section 38.1)。比如:
CREATE FUNCTION usesavedplan ( ) RETURNS trigger AS $$
if SD.has_key("plan"):
plan = SD["plan"]
else:
plan = plpy.prepare("SELECT 1")
SD["plan"] = plan
# rest of function
$$ LANGUAGE plpython;