40.3. 數據庫訪問

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") 它們非常類似在 C 裡調用 elog(LEVEL, "msg")plpy.errorplpy.fatal 實際上拋出一個 Python 例外,如果你沒有捕獲這個例外,會導致 PL/Python 模塊對 elog(ERROR, msg)的調用, 並且函數句柄從 Python 解釋器返回。 從 Python 解釋器裡長跳轉出去可能是不太好的事情。 raise plpy.ERROR("msg")raise plpy.FATAL("msg") 等效于調用 plpy.error 或者 plpy.fatal

另外,plpy 模塊提供兩個函數,叫 executeprepare。 拿一個查詢字串和一個可選的限制參數調用 plpy.execute 可以運行該查詢,並且結果返回到一個結果對象裡。 結果對象仿真一個列表或者一個字典對象。 結果對象可以通過行號和字段名來訪問。它有下面這些額外的方法: nrows() 返回該查詢返回的行數, 而 statusSPI_exec() 的返回變量。結果對象可能被修改。

比如:

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 函數時碰到的任何錯誤都將導致服務器馬上結束該函數; 不可能使用 Python 的 try ... catch 構造捕獲錯誤條件。 比如,在傳遞給plpy.execute調用的 SQL 語句中的語法錯誤將終止該函數。 這個行為可能在將來的版本中得到修改。

在你用 PL/Python 模塊準備一個計劃的時候,該計劃是自動保存的。 請閱讀 SPI 文檔(Chapter 41)獲取這句話的含義。 為了能跨函數調用有效地使用這個特點,我們需要使用永久存儲字典 SDGD 之一,(參閱 Section 40.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;