2015-11-07 77 views
-1

我試圖返回查詢得到與像varibale字符串開頭的所有記錄我有 ,所以我這樣做:SQL字符串替換錯誤沒有足夠的論據格式字符串

"""select name from pos_order where name like '%s'||'%' order by id DESC limit 1"""%(darsh[0]) 

其中darsh是類似的東西'mostafa/'

,但它一直告訴我not enough arguments for format string

我不知道爲什麼。

+0

請勿使用字符串操作將數據添加到查詢中。改用查詢參數。 –

+0

沒有得到它?你什麼意思 ? –

+0

如果您使用的是psycopg2:http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries特別是紅色框中的一些屏幕。 –

回答

1

Python試圖在SQL中替換'%'字符。但它只有一個值 - darsh [0] - 才能使用。因此,錯誤消息,它試圖填寫兩個值,但你只給它一個。

爲了證明這一點,躲過第二%%,使您的發言

「」 「選擇pos_order name其中name LIKE '%s' 的|| '%%' ORDER BY ID DESC極限1」 「」 %(darsh [0])

不要做到這一點 - 它會讓你容易受到SQL注入。例如,如果數據庫中有一個名爲DO_BAD_THING的函數,惡意用戶可以使用精心設計的輸入字符串來執行該函數。

正確的答案是使用綁定變量,看這個問題:

question about postgresql bind variables

有關如何做到這一點的例子。

對於強調 - 不要使用字符串連接的SQL 任何東西其中最終用戶可以操縱字符串。

+0

謝謝你有幫助:) –

1

,有必要逃避%與另一%%%

"""select name from pos_order where name like '%s'||'%%' order by id DESC limit 1"""%(darsh[0]) 

但是,這是不好的做法,因爲它開啓了大門,SQL注入。當您使用Psycopg使用cursor.method參數傳遞:

cursor.execute(""" 
    select name 
    from pos_order 
    where name like %s||'%%' 
    order by id DESC 
    limit 1 
    """, (darsh[0],) 
) 

的綁定引用公認的答案被用於準備語句這是不是你的情況。

+0

謝謝你有幫助:) –

相關問題