2016-03-05 42 views
0

,psycopg2通過PIP安裝如何在psycopg2中傳遞列名作爲參數?使用python3.4.3

col = 'concept' 
cur.execute("select regexp_split_to_array(%s ,';') from MyTable limit 200",(col,)) 

給我造成這樣的:

(['concept'],)

我的建議是psycopg2生成SQL查詢類似以下內容:

SELECT 
    REGEXP_SPLIT_TO_ARRAY('concept',';') 
FROM 
    MyTable 
LIMIT 200 

所以我改了一點代碼,

cur.execute("select regexp_split_to_array(" + col + " ,';') from MyTable limit 200") 

它的工作原理,但字符串concat是UGLY,並經常危險的sql。有沒有更好的方法來做到這一點?

回答

1

不幸的是,你自己創建這樣的SQL字符串或多或少受到限制,儘管可能有更漂亮的方法來使用字符串連接。

您是正確的,允許未經驗證的用戶輸入作爲SQL查詢的一部分可能是危險的(搜索「SQL注入」以查找醜陋的細節)。雖然可以使用通常所說的"parameterized queries"將數據值插入到SQL中,但不幸的是,此技術不能與列名一起使用。其原因有些複雜 - 參數化用於準備執行語句的優化版本,並且允許變量列名稱會使優化無效。

但是,您可以使用Python的任何一種字符串格式化技術來創建語句,其中任何一種都比連接更漂亮。

"select regexp_split_to_array(%s ,';') from MyTable limit 200" % col 

"select regexp_split_to_array({} ,';') from MyTable limit 200".format(col) 

都將創建你所需要的聲明。

相關問題