2011-12-07 37 views
3

我目前使用Python 2.7的SQLite 3數據庫API。當我去執行像這樣的查詢:?不在SQLite查詢通過Python看到

c.execute('''select ? from music where ? like "%?%"''', (attr, attr, query)) 

我得到以下錯誤:

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 2, and there are 3 supplied. 

我認爲%?%是什麼把它扔了。

回答

3

您誤解了參數替換的使用。您可以使用?來代替SQL語句中的整個單一變量值。您不能使用它來代替列名或表名,也不能將它用作字符串值較大的部分

在這種情況下,你可以這樣做:

c.execute('SELECT colname FROM music WHERE other_colname LIKE ?', ('%' + query + '%')) 

如果你想在列名稱必須使用字符串格式化做子。如果你這樣做,並且這些值來自用戶輸入,你需要小心避免SQL注入。您受保護的替代參數,但不是字符串格式。

+0

非常感謝。 –

+0

沒問題。無法替換數據庫實體名稱是件壞事,但如果沒有可用的信息,引擎將無法準備和預編譯查詢。 –