2011-06-17 80 views
2

朋友:如何在pl/python中參數化查詢的WHERE子句?

一直試圖在pl/python中查詢參數 - 我肯定在這裏丟失了一些簡單的東西;我試過%和$ prepends到變量名,沒有運氣。

(還沒有能夠將結果變量傳遞到Python日誌 - 但這是一個差異問題!我有日誌設置 - 可以發送文字字符串 - 但已切出大量的代碼爲清楚起見,在這裏)

CREATE OR REPLACE FUNCTION footest0 (param_key integer) RETURNS text AS $$ 

# 1) SELECT from record based on parameter param_key: 

rv = plpy.execute("SELECT name_key,address_key FROM file WHERE foreign_key = param_key) 

name = rv[0]["name"] 
address = rv[0]["address"] 

# how to put results into the log?: 
logging.info(' record: %(case)s') 

$$ LANGUAGE plpythonu; 

回答

2

使用$n符號:

st = "SELECT name_key,address_key FROM file WHERE foreign_key = $1" 
pst = plpy.prepare(st, [ "integer" ]) 
rv = plpy.execute(pst, [ param_key ]) 
+0

Paulo - 正是我需要的!我沒有完全得到那個輸入格式的'整數',而不是它的實際值。古拉爵! – DrLou 2011-06-19 17:47:04

2

我不知道你問什麼,但如果你想參數化你使用控制在一個查詢中使用聯接的列,參數不工作是辦法。

如果你真的想這樣做,你可以隨時使用字符串格式化來創建SQL查詢,如下所示:

rv = plpy.execute("SELECT name_key, address_key FROM file WHERE %s = %s" % 
        (foreign_key, param_key)) 

如果您只是要比較foreign_key爲一個字符串, Paulo有你正在尋找的答案。

+1

當心SQL注入的! – 2011-06-17 04:01:29

+0

如果'param_key ==「2351 AND 1 = 1」'或'param_key ==「2351; UPDATE auth_user SET password ='0w3d'WHERE username ='admin'」''怎麼辦?危險的東西! '$ n'表示法將通過適當的引用來處理安全問題。 – 2011-06-17 05:06:12

+0

你是對的,如果數據來自用戶,那麼在用於字符串格式化之前需要對其進行消毒。 – ironchefpython 2011-06-17 05:16:00