2014-05-04 65 views
0

嘗試執行SQLite3查詢時出現語法錯誤。問題是因爲變量inputPattern包含's。Python,SQLite:'%s'中的撇號

功能是:

def searchForExactEnglishToCzechTranslation(inputPattern,db): 
    if "\'" in inputPattern: 
     inputPattern.replace("'","''") 
    result = db.execute("SELECT czech FROM translations WHERE english='%s'" % (inputPattern)).fetchall() 

我想更換標誌「,但仍無法工作的。

你會給我一個建議嗎?謝謝

回答

4

不要使用插值;使用SQL參數:

def searchForExactEnglishToCzechTranslation(inputPattern,db): 
    result = db.execute("SELECT czech FROM translations WHERE english=?", 
         (inputPattern,)).fetchall() 

這需要照顧引用的(在?沒有用引號括起來),並逃逸。

引述sqlite3 module documentation

通常你的SQL操作將需要從Python的變量使用的值。你不應該使用Python的字符串操作來組裝你的查詢,因爲這樣做是不安全的;它會使您的程序容易受到SQL注入攻擊(請參閱http://xkcd.com/327/以瞭解可能出錯的幽默示例)。

而是使用DB-API的參數替換。將?作爲佔位符,無論您想要使用某個值,然後提供一個值元組作爲遊標的​​方法的第二個參數。 (其他數據庫模塊可以使用不同的佔位符,如%s:1。)

+1

今天我得知python文檔引用XKCD。 – roippi

+0

@roippi:尊重是相互的;請參閱http://xkcd.com/353/和/或打開Python並鍵入'import antigravity'。 –

+0

@MartijnPieters謝謝你的作品! – Mill