2009-06-17 77 views
10

我這行,工程確定:SQLite的參數替換和引用

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name) 

但我想使用SQLite參數替代,而不是替代的字符串替換(因爲我看到here這是安全的)。

這是我的(失敗)的嘗試:

t = (name,) 
c.execute('select cleanseq from cleanseqs WHERE newID="?"',t) 

但這行返回:

「提供的綁定 數有誤。目前的聲明使用 0,並提供了1個。'

因此,我的聲明的左側部分不起作用。我提供了一個綁定(名稱,在t中),但似乎沒有解析問號(?)。如果我刪除了「?」的引號,它就會起作用。但我想要引用留在那裏,因爲我記得有些情況下我需要它們。

所以現在的問題是:如何轉換這一行:

c.execute('select cleanseq from cleanseqs WHERE newID="%s"'%name) 
+0

這是很好的使用參數,它不是隻有更安全,但也更快。閱讀這裏:http://stackoverflow.com/questions/904796/how-do-i-get-around-the-problem-in-sqlite-and-c/926251#926251 – tuinstoel 2009-06-17 08:13:34

回答

9

約「」「如果我刪除引號sourronding的,它的工作原理,但我想引號保留在那裏,因爲我記得有我需要他們的情況。 「」「

您從建立整個SQL語句時記住的內容與您無關。

新的故事是:標有? SQL語句中您希望替換值的每個位置,然後傳入包含每個值一個值的元組。 - 這很簡單;包裝器會引用任何字符串以確保它們是可接受的SQL常量。

4

失去周圍的報價?

c.execute('select cleanseq from cleanseqs WHERE newID=?',(t,)) 

它把它當作字符串「?」處理。

你是否需要在整個表達式中使用雙引號而不是單數?

2

圖書館將爲您處理引用和轉義。只要寫你的查詢是這樣的:。

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=?', (name,)) 
13

我找到命名參數綁定風格更可讀 - 和sqlite3支持它:

c.execute('SELECT cleanseq FROM cleanseqs WHERE newID=:t', locals()) 

注:通過{'t': t}dict(t=t)代替locals()會更一絲不苟正確的,但在我看來,它會當有多個參數和/或更長的名稱時會干擾可讀性。無論如何,我確實發現:t?更好;-)。

+0

+1它還使得在同一查詢中多次重複使用變量變得更加容易,而不必多次重新添加變量。 – Martijn 2013-02-24 16:23:59

18

對於任何喜歡我的人來說,發現這個主題讓人非常沮喪,因爲人們忽視了有時你不能忽略引號的事實(因爲你正在使用LIKE命令),你可以通過做一些事情來解決這個問題效果如下:

var = name + "%" 
c.execute('SELECT foo FROM bar WHERE name LIKE ?',(var,)) 

這將允許你在這種情況下替換通配符。

0

普通用戶

只注意到你必須使用sql_string的不安全方法=「其他SQL surger這裏..字段名= \」「+價值做這個手冊+」 \「;」

其唯一的方法就是讓它解析正確。 使用SQLite獲勝。並很好地離開了我沒有其他的選擇,只是逃避你的價值觀才把它們放入其他你最有可能結束了一個非常傷心的數據庫從SQL注入:'(大聲笑